C ++ delete语句没有做我认为应该做的事情 - 返回错误

时间:2014-01-18 22:25:09

标签: c++

我正在查看以下代码段。它编译得很好,但在包含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 ++编译器。

谢谢

5 个答案:

答案 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指向堆中的某个位置。然后你将这一点重写到堆栈中的某个位置。现在你在堆上有一些你无法访问的地方 - 那是你的错误