标签:namespace 例子 new test null opera class 标准库 本质
为了防止内存的释放问题,c++臭名昭著的内存泄露等,相当于把当前申请的内存托管给指针管理类,通过这个类间接访问实际类
本质就是把当前申请的内存传到一个类中,让这个类存储指针,通过重载的方式间接访问这个存储的指针类
可以这么说,有了智能指针的出现,在c++的代码中就不应该再频繁的出现裸指针
简易shared_pointer实现:
#ifndef SMARTPOINTPER_H_
#define SMARTPOINTPER_H_
#include "Log.h"
namespace DTLib {
template <typename T>
class SmartPointer {
public:
SmartPointer(T* pointer = nullptr) {
LOG_FC();
if(pointer == nullptr) {
LOG_E("pointer == NULL");
return;
}
m_pointer = pointer;
}
SmartPointer(const SmartPointer& pointer) {
if(pointer.m_pointer != nullptr) {
m_pointer = pointer.m_pointer;
const_cast< SmartPointer<T>& >(pointer).m_pointer = nullptr;
}
else {
LOG_E("pointer == NULL");
return;
}
}
SmartPointer& operator = (const SmartPointer& pointer) {
if(this == &pointer) {
return *this;
}
if(pointer.m_pointer != nullptr) {
if(m_pointer != nullptr) {
LOG_FC();
delete m_pointer;
m_pointer = nullptr;
}
m_pointer = pointer.m_pointer;
const_cast< SmartPointer<T>& >(pointer).m_pointer = nullptr;
}
else {
LOG_E("pointer == NULL");
}
return *this;
}
T* operator -> () {
return m_pointer;
}
T& operator * () {
return *m_pointer;
}
T* Get() {
if(m_pointer == nullptr) {
LOG_E("pointer == NULL");
return nullptr;
}
return m_pointer;
}
bool IsNull() {
return m_pointer == nullptr;
}
~SmartPointer() {
if(!IsNull()) {
LOG_FC();
delete m_pointer;
m_pointer = nullptr;
}
}
private:
T* m_pointer;
};
} // namespace
#endif // SMARTPOINT_H
常用智能指针简介
1.unique_ptr
作为一种独占所有权的ptr,使用get()获得当前包含的指针
本质是让智能指针类的拷贝构造和赋值操作符重载失效
例子
#include <iostream>
#include <memory>
#include "Log.h"
class Test {
public:
void print() {
std::cout << "print()" << std::endl;
}
};
int main()
{
std::unique_ptr<Test> a(new Test());
a->print(); //调用指向的内存函数
//std::unique_ptr<Test> b(a); //无法编译通过
std::unique_ptr<Test> b(a.get());//可以编译通过,破坏了独立性
b->print(); //调用指向的内存函数
std::shared_ptr<Test> shared(new Test());
shared->print(); //调用指向的内存函数
std::shared_ptr<Test> shared_b(shared); // 编译通过
shared_b->print(); //调用指向的内存函数
std::weak_ptr<Test> wake(shared);
std::shared_ptr<Test> wake_one = wake.lock();
wake_one->print();
std::shared_ptr<Test> wake_two = wake.lock();
wake_two->print();
return 0;
}
个人觉得对于标准库而言会用就好,懂得原理足够
标签:namespace 例子 new test null opera class 标准库 本质
原文地址:https://www.cnblogs.com/zero-waring/p/12656295.html