c++ qt 智能指针auto_ptr,unique_ptr,shared_ptr,weak_ptr这些指针的原理只有一个,我就不花里胡哨了

本文介绍了C++中的智能指针,包括SmartPointer类的生命周期管理,如何通过构造函数传递普通类的指针实现自动内存释放,以及使用模板和共享引用计数器的示例。

普通类

下面定义了类演示他的生命周期 

#include <iostream>

class SmartPointer {
public:
    /*__FUNCTION__ 打印函数名*/
	SmartPointer() { std::cout << __FUNCTION__ << std::endl; }
	~SmartPointer() { std::cout << __FUNCTION__ << std::endl; }
};

void test() {
    //局部变量类,test函数执行完sp就析构释放内存
	SmartPointer sp;
}

int main() {
	test();
	return 0;
}

上面代码的运行结果,这里就是C++的特性: 

SmartPointer::SmartPointer
SmartPointer::~SmartPointer

 普通类变成智能指针

利用上面所讲述的C++特性完成智能指针的改造

#include <iostream>

class Test {
public:
	Test() { std::cout << __FUNCTION__ << std::endl; }
	~Test() { std::cout << __FUNCTION__ << std::endl; }
};


class SmartPointer {
public:
	SmartPointer(void* ptr):m_ptr(ptr){}
	~SmartPointer() {
		if (m_ptr != NULL) {
			delete (Test*)m_ptr;
			m_ptr = NULL;
		}
	}

private:
	void* m_ptr;
};

void test() {
	SmartPointer sp(new Test);
}

int main() {
	test();
	return 0;
}

上面代码的运行结果: 

Test::Test
Test::~Test

借助SmartPointer普通类的成员变量,构造时传参SmartPointer sp(new Test);也就是void* m_ptr=new Test,test函数执行完~SmartPointer就析构并且delete成员变量m_ptr,new Test完成了自动释放

使用模板类实现就更方便了,执行结果和上面一样

什么共享引用计数器定义一个count用来加减给了好几个指针赋值同一个对象就count+1析构就count-1等于0就释放内存,唯一指针就是构造后赋值函数设置城private成员外不调用就报错不久时唯一性了想怎么玩就自己定义,我就定义了一个常用的->指针符号

#include <iostream>

class Test {
public:
    Test() { std::cout << __FUNCTION__ << std::endl; }
    ~Test() { std::cout << __FUNCTION__ << std::endl; }

    int count;
};

template <typename _Ty>
class SmartPointer {
public:
    SmartPointer(_Ty *ptr) :m_ptr(ptr) {}
    ~SmartPointer() {
        if (m_ptr != NULL) {
            delete m_ptr;
            m_ptr = NULL;
        }
    }

    //定义了->指针符号
    _Ty *operator->() {
        return m_ptr;
    }

private:
    _Ty *m_ptr;
};

void test() {
    SmartPointer<Test> sp(new Test);
    sp->count=100;
}

int main() {
    test();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值