我特别想知道以下情况(我在一些我必须使用的代码中发现的):
SomeClass *ar = new SomeClass[2];
ar++;
delete[] ar;
这段代码似乎工作正常 - 即没有崩溃(win32,用 VS2005 构建)。
这“合法”吗?感觉肯定不对。
不,未定义将任何地址传递给delete
未返回new
.
这是标准的引用。
§ 3.7.4.2-3
如果释放函数通过抛出异常而终止,则行为是未定义的。提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。否则,提供的值
给操作员delete(void*)
标准库中的值应是先前调用任一运算符返回的值之一new(std::size_t)
or operator new(std::size_t, const std::nothrow_-t&)
在标准库中,以及提供给运算符的值delete[](void*)
标准库中的值应是先前调用返回的值之一operator new[](std::size_t)
or
operator new[](std::size_t, const std::nothrow_t&)
在标准库中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)