所以我必须实现像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()中的一些行,但它仍然没有用。我最后还是内存泄漏。
答案 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
副本将获得自己的向量。