创建另一个对象时出现内存错误

时间:2016-03-11 10:56:27

标签: c++

所以我必须实现像linux这样的文件夹和文件系统。

我的文件夹对象包含一个带有Folder对象的向量,另一个带有Files。当我尝试将第二个新项目添加到Folder对象中的Folder向量时,我收到了内存错误。我相信我可以在事故中删除一些内容,但我不知道它可能在哪里。

  

main(24984,0x7fff7d486300)malloc: *对象0xe000000000000000的错误:未释放指针被释放   * 在malloc_error_break中设置断点以进行调试   中止陷阱:6

以下是我的流程代码:

        Folder *currentF=new Folder("Home",NULL);
        cout<<"Enter name of new directory: "<<endl;
        string tempdirName;
        cin>>tempdirName;
        Folder *folder2=new Folder(tempdirName,currentFolder);
        currentFolder->addFold(*folder2);

Folder.h文件

class Folder{

private:
    string name;
    vector<File> *files;
    vector<Folder> *folders;
    Folder *upper; //the folder above this one in the tree
public:
    Folder();
    Folder(string n, Folder *u);
    string getName();
    vector<File> *getFiles();
    vector<Folder> *getFolders();
    Folder *getUpper();
    void addFold(Folder f);
    void delFold(Folder f);
    void setUpper();
    ~Folder();
};

folder.cpp

Folder::Folder(string n, Folder *u){

name=n;
upper=u;
files=new vector<File>();
folders=new vector<Folder>();

}
string Folder::getName(){
    return name;
}
vector<File> *Folder::getFiles(){
return files;
}
vector<Folder> *Folder::getFolders(){
    return folders;
}
Folder *Folder::getUpper(){
    return upper;
}
void Folder::addFold(Folder f){

    folders->push_back(f);

}
Folder::~Folder(){
    delete files;
    delete folders;
    upper=NULL;
    delete upper;
}

我完成后尝试使folder2 = NULL。什么也没做。我甚至评论了~Docle()中的一些行,但它仍然没有用。我最后还是内存泄漏。

1 个答案:

答案 0 :(得分:0)

void Folder::addFold(Folder f){

    folders->push_back(f);

}

这不可行。 push_back函数生成向量所拥有的指定Folder的副本。但现在,f和向量中新创建的Folder认为它们拥有相同的向量(*(f->files)*(f->folders))。当f被销毁时,它的析构函数会删除这些向量。当folders被销毁时,它的析构函数也会删除那些相同的向量,从而产生你看到的错误。

这就是rule of three存在的原因。如果您有析构函数,则可能需要复制构造函数和复制赋值运算符。但实际上,没有理由在这里使用指针。只需直接使用矢量。这样,放置在f中的folders副本将获得自己的向量。