c++ - 在变量地址上调用 delete

标签 c++ runtime-error stack-overflow delete-operator

我为什么要这样做:

int i = *(new int (5));

然后成功地使用i

但是当我尝试时:

delete &i;

我遇到运行时错误:

Unhandled exception at 0x5ddccaf7 (msvcr100d.dll) in Test.exe: 0xC00000FD: Stack overflow.

如果 i 是一个引用:

int & i = *(new int (5));

,所有这些(包括 delete)工作正常。

我知道,将分配的内存处理程序保留在指针以外的其他东西中是不好的,*(new ...) 很糟糕,但我只是想知道,为什么 new 运行良好,但 delete 失败。

//以下是我对这种行为原因的猜测:

是不是因为执行程序的模块(它可能不是“编译器”,因为已经有运行时)遇到delete时,它会搜索一些&i 指向的数据长度之类的信息(在关于所有指针的此类信息的某个内部数组中)找不到它或将一些垃圾数据解释为该信息? (我想,指针和引用有它,但变量没有)

最佳答案

您的原始版本没有将 i 分配给地址。它在堆上分配一个新的 int 并将其值初始化为 5,然后将该值复制到堆栈上的 i 中。您分配的()内存不可访问并泄漏。

引用版本有效,因为 i 指的是其他匿名的 new 内存。因此 &i 给出堆地址。在您的第一个版本中,&i 给出堆栈变量的地址,而不是堆内存,删除堆栈内存是个坏消息。

关于c++ - 在变量地址上调用 delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608148/

相关文章:

c++ - 跨 unix 文件系统使用带有 popen 的 FILE 描述符时崩溃

r - rm.outlier函数在data.frame中出现错误

C - 在递归方法中管理调用堆栈

c++ - 堆栈溢出会导致段错误以外的其他原因吗?

c++ - 为什么我需要 std 和字符串库才能在 C++ 中使用字符串

c++ - 仅从 Qt 编译特定库

asp.net - 看不到 ASP.NET 应用程序的真实错误消息?

添加到链接列表时出现 java.lang.stackoverflowerror

c++ - opencv - haarcascades 不适用于眼睛检测

运行暗网检测的 OpenCV 未知层类型