gpt4 book ai didi

c++ - 为什么我的堆已损坏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:25:57 30 4
gpt4 key购买 nike

我遇到错误 - 堆损坏,无法弄清楚原因。

我的基地:

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/

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