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