尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

auto_ptr(C++98,已废弃)unique_ptr/shared_ptr自定义实现

auto_ptr(C++98,已废弃)unique_ptr/shared_ptr自定义实现 目录代码完整分析(std::auto_ptr,C++98,已废弃)执行流程如果没有崩溃(注释掉p2.get()-showInfo();),完整打印输出:核心考点 auto_ptrunique_ptr 对比(正确写法)原代码现象总结自定义实现 auto_ptrauto_ptr 的致命缺陷(为什么被废弃)auto_ptr /unique_ptr 对比表三套智能指针完整总结自定义实现 unique_ptr运行输出关键要点对比拓展自定义 shared_ptr(最简版,模仿 std::shared_ptr 核心原理)运行输出std::shared_ptr 还具备的扩展点(可以继续扩展)C++ 智能指针完整对比速查表代码完整分析(std::auto_ptr,C++98,已废弃)关键点:auto_ptr拷贝构造会转移所有权,拷贝之后原智能指针变成空(内部裸指针置 nullptr)。完整代码:#include iostream #include memory // auto_ptr头文件 using namespace std; class A { int Id; public: A(int id):Id(id) { cout "A的构造函数" endl; } ~A() { cout "A的析构函数" endl; } void showInfo() { cout this-Id endl; } }; int main() { auto_ptrA p2(new A(888)); p2.get()-showInfo(); auto_ptrA p3(p2); //拷贝构造:所有权从p2转移给p3,p2内部指针置空! p3.get()-showInfo(); p2.get()-showInfo();// // p2.get()是空指针!p2.get()-showInfo(); 空指针解引用,程序崩溃! return 0; }执行流程new A(888)→ 输出:A的构造函数,堆上创建 A 对象 Id=888。p2.get()-showInfo():p2 持有对象,输出:888。auto_ptrA p3(p2);拷贝构造,所有权转移,p2内部裸指针被置为NULL;p3接管堆对象。p3.get()-showInfo():p3 有效,输出:888。p2.get()-showInfo();:p2.get()返回空指针,空指针 - 调用成员函数,运行时崩溃(段错误),后面代码不再执行。main 函数退出,局部对象析构:p3 析构,delete 堆对象,打印A的析构函数;p2 析构,内部是空指针,什么都不做。如果没有崩溃(注释掉p2.get()-showInfo();),完整打印输出:plaintextA的构造函数 888 888 A的析构函数核心考点 auto_ptrauto_ptr拷贝构造不是浅拷贝共享资源,是所有权转移;拷贝后源对象变为空。拷贝之后再使用原智能指针p2,get()得到空指针,解引用直接崩溃。C++11 已经废弃auto_ptr,推荐使用std::unique_ptr,unique_ptr直接禁止拷贝,只能移动std::move。unique_ptr 对比(正确写法)unique_ptrA p2(new A(888)); // unique_ptrA p3(p2); //编译直接报错,禁止拷贝 unique_ptrA p3 = std::move(p2); //移动语义,转移所有权面试常考:auto_ptr的缺陷:支持拷贝,拷贝转移所有权,容易造成原指针悬空,引发空指针崩溃,所以被废弃。原代码现象总结打印:A的构造函数 888 888然后程序直接崩溃,不会打印析构函数。因为p2.get()-showInfo()空指针解引用,程序直接终止,main 没有正常走完,p3/p2 的析构都没机会执行。补充:如果把崩溃那行注释掉,main 正常结束输出:A的构造函数 888 888 A的析构函数自定义实现auto_ptr背景:std::auto_ptr是 C++98 的老式智能指针,C++11 已经废弃,C++17 移除,被unique_ptr替代。 核心特点:独占所有权;拷贝构造 / 拷贝赋值会转移所有权!原指针被置空(这是它最大坑,容易踩坑);没有移动语义(C++98 没有 右值引用);析构delete裸指针;提供get()、release()、reset()接口。重点坑:auto_ptr的拷贝不是复制,是抢夺资源。auto_ptrA p1(new A(1)); auto_ptrA p2 = p1; // p1被置null,所有权转移到p2,p1失效! // 后续再使用 p1-xxx 直接崩溃完整实现代码:#include iostream using namespace std; //测试类 class A { int id; public: A(int i):id(i) { cout "A构造A析构id = " id endl; } }; templateclass T class MyAutoPtr { private: T* m_ptr; public: //构造 explicit MyAutoPtr(T* p = nullptr) : m_ptr(p) { } // ---------------- 重点:拷贝构造,会转移所有权! ---------------- MyAutoPtr(MyAutoPtr other) { //抢夺对方资源,other置空 m_ptr = other.release(); } // ---------------- 拷贝赋值,同样转移所有权 ---------------- MyAutoPtr operator=(MyAutoPtr other) { if(this ==
返回列表