加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么我的堆已损坏?

发布时间:2020-12-16 06:45:31 所属栏目:百科 来源:网络整理
导读:我收到一个错误 – 堆损坏,无法弄清楚原因. 我的基地: H: class Base{public : Base(char* baseName,char* cityName); virtual ~Base(); listVehicle*::const_iterator GetEndList(); void PrintAllVehicles(ofstream ResultFile) const; char* GetBaseNam
我收到一个错误 – 堆损坏,无法弄清楚原因.

我的基地:

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对象指向相同的数据,当它们被破坏时,它们会将其删除两次,从而导致堆损坏.

陆军类也可能也有这个问题(因为它拥有几个Base指针),但是你没有显示类的定义,因此它是否具有复制构造函数和赋值运算符并不明显.

最后,您尚未显示Base对象的分配位置.它们是否有可能被传递到陆军物体中并且还被删除在陆军物体之外的某个地方?或者也许Army对象包含的Base *指的是堆栈中不应删除的对象?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读