我遇到错误 - 堆损坏,无法弄清楚原因。
我的基地:
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
对象外的某处删除?或者 Army
对象包含的 Base*
可能指的是堆栈中不应删除的对象?
关于c++ - 为什么我的堆已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804932/