我为什么要这样做:
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/