使用C++的類模擬目錄樹
由於QVector沒有自定義刪除器的功能,直接呼叫解構函式會導致記憶體洩漏
故使用指標方式,遞迴刪除節點
我們的類還禁止在棧中定義變數,並且將解構函式設定為私有,禁止使用new的操作
所以申請物件使用entity::New,使用obj.Delete遞迴釋放子節點記憶體
`#include
include
include
include
using namespace std;
struct entity {
static entity* New() { return new entity(); }
//遞迴刪除所有的子節點
void Delete() { _delete(this); }
QVector<entity> nextes; //使用指標的方式顯示析構容器內元素
int id;
friend ostream& operator<< (ostream& os, struct entity& n);
private:
void _delete(entity
void _free() { std::cout << "this is" << this << std::endl; delete this; }
entity() :nextes(new QVector<entity>) {}
~entity() {};
};
//
////解構函式,負責釋放子節點
//entity::~entity() {
//
//}
//釋放子節點
void entity::_delete(entity* n) {
//遞迴釋放
if (n->nextes && n->nextes->size()) {
for (entity* i : *n->nextes) {
_delete(i);
}
}
n->_free();
}
ostream& operator<<(ostream& os,struct entity& n){
//遞迴呼叫
std::cout << n.id << std::endl;
if (n.nextes && n.nextes->size()) {
for (entity* i : *n.nextes) {
operator<<(os, *i);
}
}
return os;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
entity *e = entity::New() ;
e->id = 1;
entity *e1 = entity::New();
e1->id = 2;
e->nextes->append(e1);
entity *e2 = entity::New();
e2->id = 3;
e1->nextes->append(e2);
//迴圈引用錯誤
//e2->nextes->append(e);
std::cout << *e;
e1->Delete();
e = nullptr;
}
return a.exec();
}
`