题
我得到一个错误-堆腐败,不能找出原因。
我的基础:
h:
class Base
{
public :
Base(char* baseName, char* cityName);
virtual ~Base();
list<Vehicle*>::const_iterator GetEndList();
void PrintAllVehicles(ofstream &ResultFile) const;
char* GetBaseName() const;
char* GetLocation() const;
void InsertNewVehicleToBase(Vehicle* newVehicle);
list<Vehicle*>::const_iterator FindVehicle(char* id);
void RemoveVehicle (list<Vehicle*>::const_iterator beg);
private:
char* m_name;
char* m_location;
list<Vehicle*> m_baseVehicles;
};
cpp:
Base::Base(char* baseName, char* cityName)
{
m_name = new char [strlen(baseName)+1];
strcpy(m_name, baseName);
m_location = new char [strlen(cityName)+1];
strcpy(m_location, cityName);
}
Base::~Base()
{
delete [] m_name;
delete [] m_location;
//m_baseVehicles.clear();
}
军队析构:
Army::~Army()
{
list<Base*>::iterator baseIter = m_basesList.begin();
for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
delete (*baseIter);
m_basesList.clear();
}
我做错了什么?
解决方案
有明显没什么错,你已经证明代码的,因此机会是该错误是在代码中你没有显示。
最直接的可疑的东西给我的是,Base
类拥有两个指针并没有定义拷贝构造函数或赋值操作符。应你曾经复制Base
对象,这意味着,你将最终有两个Base
对象指向相同的数据,当他们破坏,他们会删除它两次,导致堆损坏。
在Army
类也可以有这样的问题,以及(因为它拥有几个Base
指针),但你不显示类的定义,所以它不是很明显它是否有一个拷贝构造函数和赋值运算符或没有。
最后,没有显示出被分配的Base
对象在哪里。难道他们被传递到Army
对象,也是Army
对象之外的某处删除?或者也许由Base*
对象包含的Army
指的对象不应删除在堆栈上?
其他提示
可见问题,这个代号:
- 使用char*不std::string需要手工存管理
- 使用 原指针在STL容器 overcomplicates清除码
- 使用CRT为串操纵 C++'码闻到
没有错给出的一段代码。 但是,随着这种代码,存在的多发性缺失的高方法可行,我的意思是deletin存储器块两次强>这导致堆损坏。
您没有发布任何有问题的代码的一部分,因为一切看起来非常正常。然而,它有很多的常量,正确性的问题:
Base(char* baseName, char* cityName);
的字符串作为应该const char*
被传递,除非它们被修改。
virtual ~Base();
没有想法,如果这需要virtual
;什么也看不见它的子类。
list<Vehicle*>::const_iterator GetEndList();
应该是一个const方法,因为它是一个const_iterator
:list<Vehicle*>::const_iterator GetEndList() const;
char* GetBaseName() const;
char* GetLocation() const;
这应该返回const char*
,因为你的代码是不成立处理的名称和位置被改变。
list<Vehicle*>::const_iterator FindVehicle(char* id);
再次应该是一个const方法:list<Vehicle*>::const_iterator FindVehicle(char* id) const;
Base::~Base()
{
delete [] m_name;
delete [] m_location;
//m_baseVehicles.clear();
}
,因为它的析构函数后立即发生了反正你不需要m_baseVehicles.clear();
。但是,你需要删除的车辆,如果他们没有在其他地方引用,否则你就会泄漏。
军队析构函数:
“析构函数”。并且其中是Army
的其余部分
Army::~Army()
{
list<Base*>::iterator baseIter = m_basesList.begin();
for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
delete (*baseIter);
m_basesList.clear();
}
同样,你不需要m_basesList.clear();
。
我看不出有什么问题。正如马特·凯恩说,它是如何得到填充?
堆损坏来自复制多个数据到除了分配给小区的存储器的分配的堆单元。堆单元的开始和结束包含比当覆盖将被报告为一个堆损坏数据。
您还没有公布所有的代码,我看不到代码中的一个问题,你已经张贴,但我会使用存储的工具,像Valgrind的,以帮助您诊断问题,提出建议。