以下是 C++ 中的示例代码片段:
Foo *ptr;
ptr = new Foo;
delete [] ptr;
这会遇到问题吗?删除这样的指针并释放内存的正确方法应该是什么?
谢谢
以下是 C++ 中的示例代码片段:
Foo *ptr;
ptr = new Foo;
delete [] ptr;
这会遇到问题吗?删除这样的指针并释放内存的正确方法应该是什么?
谢谢
是的,这可能会遇到问题。或不。从技术上讲,它的作用是undefined。
每一个都new
必须有一个delete
;每个new[]
必须有一个delete[]
。
在您的特定实例中,正确的代码路径可能是:
Foo *ptr;
ptr = new Foo;
delete ptr;
或者
Foo *ptr;
ptr = new Foo[7];
delete[] ptr;
您应该在没有[]
. 很简单delete
:
Foo *ptr;
ptr = new Foo;
delete ptr;
delete[]
用于删除动态分配的对象数组,这不是您的情况。在这里,使用delete ptr;
很好。
当分配单个元素时,例如int *pointer = new int
delete pointer;
当分配元素数组时,例如int *pointer = new int[5]
delete [] pointer;
很可能会导致问题,因为delete []
需要在数组中存储元素的数量,以便知道调用析构函数的次数。由于new Foo
不必存储该信息(因为它不是必需的delete
),因此完全有可能delete []
使用“垃圾”作为输入。