【问题标题】:Why I am getting a Heap Corruption Error?为什么我收到堆损坏错误?
【发布时间】:2010-03-15 11:54:03
【问题描述】:

我是 C++ 新手。我收到堆损坏错误。任何帮助将不胜感激。下面是我的代码

class CEntity  
{  
//some member variables  
CEntity(string section1,string section2);  
CEntity();  
virtual ~CEntity();  
//pure virtual function ..  
virtual CEntity* create()const = 0;  
};  

我从 CEntity 派生 CLine 如下

class CLine:public CEntity  
{  
// Again some variables ...  
// Constructor and destructor  
CLine(string section1,string section2);  
CLine();  
~CLine();  
CLine* Create() const;  
}  

// CLine Implementation  
CLine::CLine(string section1,string section2) : CEntity(section1,section2){};  
CLine::CLine();  
CLine* CLine::create() const {return new CLine();}  

我有另一个类 CReader,它使用 CLine 对象并将其填充到如下所示的多映射中

class CReader  
{  
public:  
CReader();  
~CReader();  
multimap<int,CEntity*>m_data_vs_entity;  
};  

//CReader Implementation  
CReader::CReader()  
{  
  m_data_vs_entity.clear();  
};  

CReader::~CReader()  
{  
  multimap<int,CEntity*>::iterator iter;  
  for(iter = m_data_vs_entity.begin();iter!=m_data_vs_entity.end();iter++)  
  {  
    CEntity* current_entity = iter->second;  
    if(current_entity)  
      delete current_entity;  
  }  
  m_data_vs_entity.clear();  
}  

我正在从文件中读取数据,然后填充 CLine 类。地图被填充到 CReader 类的函数中。由于 CEntity 有一个虚拟析构函数,我希望 CReader 的析构函数中的这段代码应该可以工作。事实上,它确实适用于小文件,但是在处理更大的文件时我得到了 HEAP CORRUPTION ERROR。如果有什么根本性的错误,那么,请帮我找到它,因为我一直在挠头想退出。
在此先感谢并等待回复,
问候,
阿图尔

从 Y'day 继续: 进一步详细研究这一点,我现在意识到在我的情况下堆分配错误是因为我正在分配一些东西,然后用更大的大小覆盖它。 下面是我的数据在构造函数中填充的代码。

CEntity::CEntity(string section1,string section2)
{
    size_t length;
    char buffer[9];
    //Entity Type Number
    length = section1.copy(buffer,8,0);
    buffer[length]='\0';
    m_entity_type = atoi(buffer);

    //Parameter Data Count
    length = section1.copy(buffer,8,8);
    buffer[length]='\0';
    m_param_data_pointer = atoi(buffer);
        //.... like wise ....
}

我以 8 个字符的固定间隔获取值,并且添加了一个“\0”,所以我想这会处理我遇到的任何垃圾值。

关于 堆分配错误:在 XXX 的正常块 (XXX) 之后,CRT 检测到应用程序在堆缓冲区结束后写入内存。 大多数情况下,堆分配错误发生在崩溃的其他地方。如果这里有人能帮助我,我将不胜感激,如何使用这个普通块和地址。 谢谢,

【问题讨论】:

  • 是实际代码吗?如果是这样,为什么create 是非静态成员函数?它应该如何使用?
  • 您能否向我们展示填充m_data_vs_entity 的代码,因为我感觉您可能会将同一个指针两次放入地图中。
  • @Naveen,我认为他的create() 是虚拟构造函数的一个例子——它不应该是静态的。
  • @Poita_:是的,你是对的。我忘记了。
  • bool CReader::process_entity(string section1,string section2) { size_t length;字符缓冲区[9]; //1.Entity Type Number length = Section1.copy(buffer,8,0);缓冲区[长度]='\0'; int ent_type = atoi(缓冲区); CEntity* current_ent = NULL; switch(ent_type) { case 110: CLine* line_entity = new CLine(Section1,Section2); current_ent = line_entity;休息;默认值:{中断; } } if(current_ent != NULL) { int PD_Pointer = current_ent->get_parameter_data_ptr(); // 为链接填充映射和多映射 ... m_data_vs_entity.insert(pair(PD_Pointer,current_ent)); } 返回真; }

标签: c++ memory-management


【解决方案1】:

嗯,你只显示了一半的问题。

创建 CLine 对象并将它们存储在 CReader 中的代码在哪里?

另外,您认为什么实际上“拥有”了 CEntity 对象?通常,您应该让“所有者”负责创建和删除...

我之前写过:

“您可能想考虑存储 直接在地图中的 CEntity, 而不是存储指针。 可能效率较低,但也 搞砸的范围要小得多。”

正如 Neil 指出的那样,您将存储的不是 CEntities,因此该建议对您没有多大帮助...

【讨论】:

  • 他不能在任何东西中存储 CEntities - 这是一个抽象类。
  • 大写的 C 可能只是一个错字,你不觉得吗?
  • @Roddy:意思是,我应该有一个的multimap,而不是multimap ,我应该直接存储继承的实体CLine等?
  • @Atul,不,我的意思是 multimap。但我没有意识到问题的多态性,所以它不会像那样工作。
  • 对此的进一步研究让我发现我正在分配
【解决方案2】:

最后,经过两天的调试,我能够修复崩溃。这是因为我从字符串中复制了错误数量的字符。
经验教训:
1.当你遇到内存分配错误时,尝试形成一个简单的测试用例,它具有最少的实体来重现问题。
2. 一个稳妥的办法是逐行调试。我同意,它考验你的耐心,但是,成功没有捷径
3. 它让您有机会进行代码审查,进一步提高您将来生成的代码的质量

感谢您的所有帮助和格式化我的代码 :)
问候,
阿图尔

【讨论】:

  • @Atul 还有一点建议。不要将添加到您的问题、额外代码、解释等作为答案 - 将它们编辑到您的原始问题中。
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 2019-10-23
  • 2019-01-09
相关资源
最近更新 更多