如果delete []“知道”任何动态分配的数组的大小,我不应该以某种方式查询它的大小吗?
这是来自cplusplus.com和我自己的一些代码混合来表明我的意思:
// operator delete[] example
#include <iostream> // std::cout
struct MyClass {
MyClass() {std::cout <<"MyClass constructed\n";}
~MyClass() {std::cout <<"MyClass destroyed\n";}
};
int main () {
MyClass * pt;
MyClass * foo;
MyClass * bar;
pt = new MyClass[3];
delete[] pt;
foo = new MyClass[12];
delete[] &foo[0]; // this works
bar = new MyClass[33];
delete[] &bar[1]; // this does not work
return 0;
}
动机:如果数组的第一个元素是特殊的,那么只需要最后一个指针并递减,直到检测到第一个......(我想通过查找delete []异常/错误可以“找到” )
你的方法 - 虽然很有创意:-) - 不起作用。原因是你不能“试试”delete
;你必须确保传递给delete
的指针是之前由new
获得的指针。否则,行为未定义(例如,参见cppreference.com上的this definition of delete):
如果未从相应的标准库分配函数获取传递给标准库释放函数的指针,则行为未定义。
所以任何不是“第一个指针”(即数组的开头)的尝试都会产生未定义的行为(崩溃,某些模糊,甚至没有),你不能依赖这样的“行为”。