【发布时间】:2019-06-20 10:29:02
【问题描述】:
假设我有一个抽象类(下例中的“Book”)和一些派生类(下例中的“ElectroniBook”、“CodingBook”)。我还想在第三类(“图书馆”)中保留一个书籍矢量和一些地图来找到它们。我们还假设我需要使用“addBook”方法从其他地方创建“库”,然后在主目录中分配它。
由于 Book 是抽象的,我最终需要删除我创建的“Book”指针,并且我想在一些析构函数中执行此操作。尽管如此,每当我尝试使用删除时,我都会收到此错误消息
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
如果我尝试用 shared_pointers 或 unique_pointers 替换原始指针,我会在编译时立即收到错误消息,告诉我我正在尝试使用已被删除的指针。请注意,我使用的是 C++ 11。
以下是一些代码示例:
class Book{
public:
Book(string name, int Npages);
virtual ~Book();
virtual void displayBook() = 0;
private:
string _name;
int _Npages;
}
class ElectronicBook : public Book{
public:
ElectronicBook(string name, int Npages);
~ElectronicBook();
void displayBook() { //do something
};
}
class CodingBook : public Book{
public:
CodingBook(string name, int Npages);
~CodingBook();
void displayBook() { // do something else
};
}
class Library{
public :
Library();
~Library(){
// this doesn't work for me
// for(auto & a : _books)
// delete a;
// _books.clear();
//
//for(int i=0;i<_bookmap.size();++i)
// delete bookmap.at(i);
};
void addCodingBook(string name, int Npages){
CodingBook* cb = new CodingBook(name, Npages);
_books.push_back(cb);
_bookmap[name] = cb;
//should I delete anything here?
};
void addEletronicBook(string name, int Npages){
ElectronicBook* eb = new ElectronicBook(name, Npages);
_books.push_back(eb);
_bookmap[name] = eb;
//should I delete anything here?
};
private :
vector<Book*> _books;
map<string, Book*> bookmap;
}
// separeted function
Library createLibrary(){
Library L;
while(...){
//read books from somewhere(file, input or whatever) and
// addElectronicBook(...)
// addCodingBook(...)
}
return L;
}
int main(){
Library myLibrary = createLibrary();
// do something with Library
}
由于我多次“新建”添加图书,我需要删除它们。我尝试像我展示的那样在库析构函数中执行此操作,但我得到了前面提到的错误。
【问题讨论】:
-
在您的设置中完全避免使用指针。如果需要,请使用 shared_ptr。
-
"如果我尝试用 shared_pointers 或 unique_pointers 替换原始指针,我会在编译时立即收到错误消息,告诉我我正在尝试使用已被删除的指针。"一个不会删除智能指针 - 这在某种程度上违背了他们的目的。我建议您发布尝试使用它们的代码,因为这是正确的方法,但对您不起作用