我正在查看以下代码段。它编译得很好,但在包含delete语句时返回错误。错误是未分配释放的指针。我错过了什么?我对堆栈溢出站点的搜索没有提出一个完全重复这个问题的问题。指向“重复”的链接看起来不像我的副本。
代码是......
long val2 = 72;
long *pval2 = NULL;
pval2 = new long;
pval2 = &val2;
std::cout << "pval2 = " << *pval2 << "\n"; //prints the correct value
delete pval2;
我正在使用的编译器是项目Xcode开发工具中的c ++编译器。
谢谢
答案 0 :(得分:3)
pval2 = new long;
这为你提供了一些内存空间。
pval2 = &val2;
然后立即抛出该内存空间并使指针指向val2
(不是free
内存的位置)。如果您打算将val2的值复制到新的内存地址中,那么您需要取消引用指针:
*pval2 = val2;
答案 1 :(得分:3)
您只能删除new返回的内存地址。 &amp; val2是堆栈上的地址,将其发送到删除是一个错误。
最后,一旦你用&amp; val2覆盖pval2,你就丢失了堆上分配的先前内存地址,所以这是内存泄漏......
答案 2 :(得分:2)
pval2 = new long;
分配一个long并将其地址存储在pval2
。
pval2 = &val2;
然后用另一个地址覆盖该地址,即val2
的位置。此时你已经丢失了分配的长地址。
因此,当你最终归结为delete pval2;
时,它会尝试释放你从未首先用new分配的东西,从而导致问题。
答案 3 :(得分:1)
您正在尝试删除堆栈中的内容
此行pval2 = &val2;
指向堆栈上的某些内容。
答案 4 :(得分:1)
分配后pval2指向堆中的某个位置。然后你将这一点重写到堆栈中的某个位置。现在你在堆上有一些你无法访问的地方 - 那是你的错误