简单模拟Qt的子类内存释放

用过Qt的朋友都知道,继承自QObject的子类,只要delete父对象可以自动delete父对象的所有子对象,今天我们来用几行代码模拟一下

#include <QList>
class A
{
public:
	A(A *parent = nullptr)
	{
		if (parent)
			parent->addChild(this);
	}

	virtual ~A()
	{
		QList<A *>::iterator it;
		for (it = m_lstChild.begin(); it != m_lstChild.end(); ++it)
		{
			delete *it;
		}
	}

protected:
	void addChild(A *chlid)
	{
		m_lstChild.push_back(chlid);
	}

private:
	QList<A *> m_lstChild;
};

class B : public A
{
public:
	B(int i,A *parent = nullptr):A(parent)
	{
		p = new int;
		*p = i;
	}

	virtual ~B()
	{
		delete p;
	}

private:
	int *p;
};

int main(int argc, char *argv[])
{
	B *ch1 = new B(1);
	B *ch2 = new B(2, ch1);

	delete ch1;
	
	return a.exec();
}

简单解释一下上面的代码
QList这个头文件不重要,这里主要是个链表,可以用Qt的,也可以用stl的,也可以用自己写的
代码的主要思想是在A类中记录一个子对象的指针链表,当父对象delete的时候,遍历自己的子对象指针链表,依次delete掉自己的所有子对象
在main函数中,首先new一个父对象ch1,然后new一个子对象ch2,设置其父对象为ch1
当delete ch1时,首先掉用ch1的B类的析构函数,释放指针p,然后调用ch1的父类A的析构函数,在A的析构函数中遍历自己的子对象指针链表。
此例中只有一个子对象ch2,遍历到ch2的指针时,delete掉ch2的指针,在该过程中,首先调用ch2的B类虚构函数释放掉ch2的B类p指针,然后调用ch2的A类的析构函数,发现ch2没有子对象,释放掉ch2的A类后delete掉ch2指针这一过程结束,然后继续释放ch1的A类内存,知道ch1释放完成
这样就可以只通过释放ch1的内存去释放ch2的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木千

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值