普通类
下面定义了类演示他的生命周期
#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;
}
本文介绍了C++中的智能指针,包括SmartPointer类的生命周期管理,如何通过构造函数传递普通类的指针实现自动内存释放,以及使用模板和共享引用计数器的示例。
942

被折叠的 条评论
为什么被折叠?



