int* max = new int;
上面的行在堆栈上创建了一个指针,并使用存储在堆中的整数对其进行初始化。每当new
涉及到表达式时,它都会返回一个指向其动态创建的操作数的指针:
根据 C++11 标准的第 5.3.4/2 段:
-表达式创建的实体new
具有动态存储持续时间 (3.7.4)。[ -- ]如果实体是非数组对象,则 new 表达式返回一个指向所创建对象的指针。如果它是一个数组,则new
- 表达式返回一个指向数组初始元素的指针。
int myVar = 20;
int* pVar = &myVar;
在此示例中,指针及其值都存储在堆栈中。new
分配中不涉及 - 表达式,因此在这种情况下不会在堆上创建任何内容。
如果要在一行中初始化指向对象的值,则必须像这样对其进行值初始化:
int* max = new int(5);
或在 C++11 中,您可以使用统一初始化:
int* max = new int{5};
同样重要的是您要记住delete
您创建的内容new
。由于内存是动态分配的,它的生命周期不依赖于它被创建的范围。如果你忘记了delete
你的程序会得到内存泄漏。
delete max;
如果max
将指针设置为由 - 表达式创建的数组new
,您将使用delete[]
:
delete[] max;
注意:如果指针不是由 -表达式初始化new
的,则无需删除。
通常建议您使用容器来为您管理内存。类似的东西std::unique_ptr
会做。一旦它的析构函数被调用,它持有的内存就会被删除:
std::unique_ptr<int> max{new int{5}};
在 C++14 中,我们有make_unique
:
auto max = std::make_unique<int>(5);