为什么我的堆已损坏?

Roy*_*lov 3 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;

};  
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

军队破坏者:

Army::~Army()
{
    list<Base*>::iterator baseIter = m_basesList.begin();
    for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
        delete (*baseIter);
    m_basesList.clear();
 }  
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ste*_*end 7

此代码存在明显问题:

  • 使用char*not std :: string需要手动内存管理
  • 在STL容器中使用原始指针会使清理代码过于复杂
  • 使用CRT进行字符串操作是C++的"代码味道"


Tyl*_*nry 7

您显示的代码没有明显错误,因此错误可能在您未显示的代码中.

对我来说最直接可疑的是Base该类拥有两个指针,并且没有定义复制构造函数或赋值运算符.这意味着如果你复制一个Base对象,你最终会得到两个Base指向相同数据的对象,当它们被破坏时,它们会将它删除两次,从而导致堆损坏.

Army班还可以有这样的问题,以及(因为它拥有几个Base三分球),但你不显示类的定义,所以它是否有一个拷贝构造函数和赋值运算符或不不是很明显.

最后,您尚未显示Base对象的分配位置.是否有可能将它们传递到Army对象中并删除Army对象外的某个位置?或者对象所Base*包含的内容可能Army是指堆栈中不应删除的对象?


小智 5

给出的代码没有错.但是使用这种代码,多次删除的可能性很高,我的意思是将内存块删除两次会导致堆损坏.