使用C++的类模拟目录树
由于QVector没有自定义删除器的功能,直接调用析构函数会导致内存泄漏
故使用指针方式,递归删除节点
我们的类还禁止在栈中定义变量,并且将析构函数设置为私有,禁止使用new的操作
所以申请对象使用entity::New,使用obj.Delete递归释放子节点内存
#include <QCoreApplication>
#include <QVector>
#include <QString>
#include <iostream>
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* next);
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();
}
浙公网安备 33010602011771号