使用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();
}
posted @ 2020-12-30 11:30  iwetuan  阅读(352)  评论(0)    收藏  举报