【问题标题】:C++ delete statement isn't doing what I think it should -- returns an error [duplicate]C ++ delete 语句没有做我认为应该做的事情——返回错误[重复]
【发布时间】:2014-01-18 22:25:08
【问题描述】:

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

谢谢

【问题讨论】:

标签: c++


【解决方案1】:
pval2 = new long;

这会给你一些内存空间来玩。

pval2 = &val2;

然后立即丢弃该内存空间并使指针指向val2 的位置(不是freeable 内存)。如果您打算将 val2 的 value 复制到新的内存地址中,则需要取消引用指针:

*pval2 = val2;

【讨论】:

    【解决方案2】:

    你只能给删除一个由new返回的内存地址。 &val2 是堆栈上的地址,将其发送到删除是错误的。

    最后,一旦你用 &val2 覆盖了 pval2,你就丢失了之前分配在堆上的内存地址,所以这是内存泄漏……

    【讨论】:

      【解决方案3】:

      pval2 = new long; 分配一个 long 并将它的地址存储在pval2 中。

      pval2 = &amp;val2; 然后用另一个地址覆盖该地址,即val2 的位置。此时,您已经丢失了分配的 long 的地址。

      因此,当您最终到达 delete pval2; 时,它会尝试释放您一开始从未分配过 new 的东西,从而导致问题。

      【讨论】:

        【解决方案4】:

        您正在尝试删除堆栈中的某些内容

        这一行pval2 = &amp;val2; 指向堆栈上的某个东西。

        【讨论】:

          【解决方案5】:

          分配后 pval2 指向堆中的某处。然后你将此点覆盖到堆栈中的某个位置。现在你在堆上找到了一个你无法访问的地方——那是你的错误

          【讨论】:

          • 在上面显示的有用的cmets之后,我的工作代码如下:
          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 2016-03-19
          • 2021-11-25
          • 1970-01-01
          • 2011-09-28
          • 2020-07-05
          • 1970-01-01
          相关资源
          最近更新 更多