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

标签 c++ corruption delete-operator

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

我的基地:

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/

相关文章:

c - 为什么过早访问 ReadFileEx 的输入缓冲区会导致数据损坏?

c++ - 删除动态分配的二维数组

c++ - 在本地使用 reference_wrapper 初始化 vector

c++ - 访问私有(private)实现成员而不公开它们(C++)

c++ - VS C++ 2008 上的对齐

git - 由于缺少对象,我该如何处理 Git 损坏?

java - 如何在排序数组中找到第一次出现最大值的索引

java - 使用 java : corrupted data 从 FTP 站点下载文件

c++ - 标量删除析构函数

c++ - 为什么 std::allocator::deallocate 需要大小?