c++ - 我可以删除 [] 指向已分配数组的指针,但不指向它的开头吗?

标签 c++

我特别想知道以下情况(我在一些我必须使用的代码中发现):

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/

相关文章:

javascript - 如何在 Qt Creator 中的 main.cpp 文件之外声明函数

c++ - reinterpret_cast 会导致严格的别名冲突吗?

c++ - 断点未命中静态链接库中的全局静态初始化类

c++ - C++ 编译器是否对 lambda 闭包执行编译时优化?

c++ - 将预定义颜色添加到简单的 C++ 颜色类

c++ - 如何定义声明的函数 - 具有未命名模板参数的模板结构成员?

c++ - 我们可以在不调用 va_start 的情况下调用 va_end 吗?

c++ - 为多个 body 使用 Sprite

c++ - 静态强制转换中的表达式

c++ - 智能感知:错误 C2440: '=':无法从 'unsigned long (__stdcall *)(const char *)' 转换为 'IPAddr'