为什么我会收到堆损坏错误?

时间:2010-03-15 11:54:04

标签: c++ memory-management

我是C ++的新手。我正在获得HEAP CORRUPTION ERROR。任何帮助将受到高度赞赏。以下是我的代码

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检测到应用程序在堆缓冲区结束后写入内存。大多数情况下,堆分配错误发生在除崩溃之外的其他地方。如果有人在这里帮助我,如何利用这个正常的块和地址,我将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:1)

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

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

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

我之前写过:

  

“您可能会考虑存储   CEntity直接在地图中,   而不是存储指针。   可能效率较低,但也是如此   对于cockups的范围要小得多。“

正如尼尔所指出的那样,你所存储的不是CEntities,所以这个建议对你没什么帮助......

答案 1 :(得分:0)

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

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