gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:10:05 25 4
gpt4 key购买 nike

我是 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 类。 map 在 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 的正常 block (XXX) 之后,CRT 检测到应用程序在堆缓冲区结束后写入内存。 大多数情况下,堆分配错误发生在它崩溃的其他地方。如果有人能帮助我,我将不胜感激,如何使用这个普通 block 和地址。谢谢,

最佳答案

好吧,你只展示了一半的问题。

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

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

我之前写过:

"You might like to consider storing the CEntitys directly in the map, rather than storing pointers. Potentially less efficient, but also much less scope for cockups."

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

关于c++ - 为什么我会收到堆损坏错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2446839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com