我特别想知道以下情况(我在一些我必须使用的代码中发现):
SomeClass *ar = new SomeClass[2];
ar++;
delete[] ar;
这段代码似乎运行良好 - 即没有崩溃(win32,用 VS2005 构建)。
这是“合法的”吗?感觉肯定不对。
最佳答案
不,将任何未由 new
返回的地址传递给 delete
是未定义的。
这是标准的引述。
§ 3.7.4.2-3
如果释放函数因抛出异常而终止,则行为未定义。提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。否则,提供的值
标准库中的操作符 delete(void*)
应该是之前调用操作符 new(std::size_t)
或 返回的值之一标准库中的 operator new(std::size_t, const std::nothrow_-t&)
,标准库中提供给 operator delete[](void*)
的值应是先前调用 operator new[](std::size_t)
或
operator new[](std::size_t, const std::nothrow_t&)
在标准库中。
关于c++ - 我可以删除 [] 指向已分配数组的指针,但不指向它的开头吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420329/