shared

mac2026-02-08  0

一、原理

为了避免new了对象后忘记delete,或者对象的销毁时机不确定,通过shared_ptr可以自动销毁没有被引用的对象。

二、注意点

shared_ptr并不能解决循环引用的问题,如果有循环引用,不能自动delete指向的对象。 shared_ptr 线程不安全

三、测试

#pragma once #include <memory> #include <iostream> using namespace std; class SharedPtrClass { public: int a; bool sharedPtr; shared_ptr<SharedPtrClass> t; SharedPtrClass(bool sharedPtr) { this->sharedPtr = sharedPtr; cout << "SharePrtClass new" << (sharedPtr?" sharedPtr":" class")<< endl; } ~SharedPtrClass() { cout << "SharePtrClass free " << (sharedPtr?" sharedPtr":" class") << endl; } }; class SharedPtr { public: void doTest() { cout << "autoDelete before" << endl << endl; autoDelete(); cout << "autoDelete exit" << endl << endl; cout << endl << endl << endl; cout << "circularRef before" << endl << endl; circularRef(); cout << "circularRef exit" << endl << endl; } void autoDelete() { cout << "autoDelete class start1" << endl; SharedPtrClass* a = new SharedPtrClass(false); //没有主动delete,函数退出时,并不会a指向的对象,导致内存泄漏 cout << "autoDelete class end1" << endl; cout << endl; cout << "autoDelete shared_ptr start2" << endl; shared_ptr<SharedPtrClass> b(new SharedPtrClass(true)); //智能指针在函数退出时,计数变0,从而析构指向的对象 cout << "autoDelete shared_ptr end2" << endl; cout << endl; } void circularRef() { cout << "circularRef start1" << endl; shared_ptr<SharedPtrClass> a(new SharedPtrClass(true)); shared_ptr<SharedPtrClass> b(new SharedPtrClass(true)); a->t = b; b->t = a;//循环引用,不能自动delete,导致内存泄漏,如果去掉这行,两个对象都能delete cout << "circularRef end1" << endl; cout << endl; } };

四、输出

autoDelete before

autoDelete class start1 SharePrtClass new class autoDelete class end1

autoDelete shared_ptr start2 SharePrtClass new sharedPtr autoDelete shared_ptr end2

SharePtrClass free sharedPtr autoDelete exit

circularRef before

circularRef start1 SharePrtClass new sharedPtr SharePrtClass new sharedPtr circularRef end1

circularRef exit

最新回复(0)