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);