【问题标题】:Heap corruption C++堆损坏 C++
【发布时间】:2011-12-03 15:34:12
【问题描述】:

我在尝试编译我的程序时遇到堆损坏错误。有问题的代码是一个指针

cparticle * particles. 

初始化为NULL,然后设置为

particles = new cparticle[amount]

我只在析构函数中使用了一次删除,它导致窗口触发断点。我试图使用应用程序验证器,它给了我这个信息:

===========================================================
VERIFIER STOP 0000000000000013: pid 0x17C0: first chance access violation for current     stack trace 

000000001D54A0A4 : Invalid address being accessed
0000000055741DC6 : Code performing invalid access
000000000025E9D0 : Exception record. Use .exr to display it.
000000000025E4E0 : Context record. Use .cxr to display it.
===========================================================
This verifier stop is continuable. 
After debugging it use `go' to continue.
===========================================================



=======================================
VERIFIER STOP 00000013: pid 0x17C0: First chance access violation for current stack trace. 

1D54A0A4 : Invalid address causing the exception.
55741DC6 : Code address executing the invalid access.
001DF30C : Exception record.
001DF35C : Context record.


=======================================
This verifier stop is continuable.
After debugging it use `go' to continue.

=======================================

我不确定自己做错了什么,因此我们将不胜感激。

【问题讨论】:

  • 除非我们看到更多代码,否则我们很难调试它。
  • 显示代码有助于找出问题所在。
  • 同意@Mysticial 和@Vinzenz。作为第一个问题;你用的是delete还是delete []
  • 需要澄清一下。首先 - 当您运行程序时会发生这种情况,或者(我认为您错误地写了)当您 compile 它时会发生这种情况吗?第二 - 发布您的构造函数和析构函数逻辑(如果不是整个类)。通常,向 dtor 添加一个“cout”会有所帮助,这样您就可以判断是否发生了一些意外的额外删除。
  • 对不起,我运行程序时发生了。析构函数只是删除[]粒子,构造函数只是复制输入和粒子= NULL;粒子 = 新 cparticle[数量];

标签: c++ heap-corruption


【解决方案1】:

您是否在一个小的独立程序中复制了这个?您确定它不是由之前未被发现的其他内存违规引起的吗?您是否使用了正确的删除运算符?

【讨论】:

    【解决方案2】:

    你做错的第一件事是你没有使用std::vector<particle>

    第二件事大概是你在粒子数组的末尾写入内存。

    【讨论】:

    • 哦,我认为向量比数组占用更多空间并且使用起来更重要。哦,好吧,我会换掉它。
    • 向量会占用更多空间,您不必担心它们的性能。也就是说,使用数组非常好——毕竟 C++ 允许两者。
    • 这是一个愚蠢的评论。您可能更喜欢他使用vector,但并不是使用原始指针导致他的代码不正确。因此,您的设置(“您做错的第一件事......”)对我来说只是炎症。您可能有很好的理由推荐 STL,但这不是倡导您喜欢的风格的好方法,而且与问题无关。
    • 没问题。这只是使用高级集合类的一大优势:更难错误地使用它们。使用指针,无数的不良行为就像一小部分可取的行为一样容易访问。
    • @asveikau - 在进一步评论这个主题之前,我建议您阅读您应该阅读的书:Bjarne Stroustrup。 C++ 编程语言(第 3 版)。 ISBN:0-201-88954-4 第 C.14.11 章 首选向量而不是数组。正如 Stroustrup 解释的那样,确实没有充分的理由使用原始的新分配数组。甚至不是为了提高效率:有时人们会错误地使用数组,这样他们就可以在不复制数据的情况下转移某些数据的所有权。但是请看我对这个问题的回答:stackoverflow.com/questions/599308/…
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2018-03-26
    • 2010-10-17
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多