错误:双重免费或损坏(fasttop) - 由析构函数引起,但如何?

时间:2015-08-14 08:16:01

标签: c++ destructor

我知道完全这是错误造成的,我想我甚至可能知道为什么 - 但我无法弄清楚它在做什么:

// room.hpp

#include "linkedlist.hpp"
#include "item.hpp"

class item;
class Room {
    public:
        Room();

    private:
        LinkedList<Item> itemsInThisRoom_;
};

-

// room.cpp

#include "room.hpp"
#include <iostream>

Room::Room() {
    itemsInThisRoom_ = LinkedList<Item>();
};

链表

// linkedlist.hpp

//====================
// Class (Declaration)

template<class T> struct LinkedList {
    public:
        LinkedList();
        ~LinkedList();

    private:
        Node<T>* head_;
};

//====================
// Class (Instantiation)

template<class T> LinkedList<T>::LinkedList() {
    head_ = new Node<T>;
    size_= 0;
};

template<class T> LinkedList<T>::~LinkedList() { delete head_; };

的main.cpp

#include <iostream>
#include "room.hpp"
#include "linkedlist.hpp"

int main() {
    Room room;
    return 0;
};

在调用Room的析构函数时调用错误 - 并且仅在初始化房间对象时调用。这很好用:

#include <iostream>
#include "room.hpp"
#include "linkedlist.hpp"

int main() {
    Room* room;
    return 0;
};

另外,我可以自己构造/破坏LinkedList的实例而没有问题。我认为以某种方式'head_'被删除两次,但我无法弄清楚如何。

(有人建议我开始使用std :: unique_ptr而不是new / delete,我将开始做,但我只是想弄清楚为什么会导致错误!)

1 个答案:

答案 0 :(得分:1)

您手动管理内存,这意味着您还需要实现赋值运算符和复制构造函数。

现在,当您复制对象:itemsInThisRoom_ = LinkedList<Item>();时,在删除堆栈对象(LinkedList<Item>();)时释放内存,但itemsInThisRoom仍然指向它。

因此,当它被销毁时,它会尝试删除已在堆栈对象中删除的内存。