C++智能指针之shared _ptr、weak_ptr、unique_ptr

一、class shared_ptr

       shared_ptr具有共享式拥有的概念。即多个shared_ptr可以指向相同的对象,该对象和其相关资源会在“最后一个引用被销毁”时释放。

1、shared_ptr的初始化:

(1)直接使用初始化

shared_ptr str(new string("name"));
shared_ptr str2{ new string("name") };
//但是不能以以下方式声明一个shared_ptr:
//shared_ptr strErr = new string("name");		// 错误

(2)使用make_shared

shared_ptr str3 = make_shared("name");

       使用这种方式比较快,也比较安全,因为它使用一次而不是二次分配:一次针对对象,另外一次针对“shared_ptr”用以控制对象的shared data。

(3)使用reset

shared_ptr str4;
str4.reset(new string("name"));
// str4 = new string("name"); // 错误

(4)像使用普通指针一样使用shared_ptr

(*str4)[0] = 'N';
str4->replace(0,1, "K");

2、定义一个deleter

(1)普通的delerer

shared_ptr pt(new string("nam"), [](string * p) {
    cout << "delete " << *p << endl;
    delete p;
});

       以上例子使用lambda定义了一个自己的deleter,ptr会在其最末一个拥有者被销毁时执行者lambda函数,由此就可以推出我们可以在shared_ptr别销毁时执行我们自己的函数。实际上要想释放pt则可以给该变量赋值为nullptr或者用另一个对象给它赋值。

(2)对于数组的deleter

       注意,shared_ptr提供的默认deleter调用的是delete。不是delete{},这意味着只有当shared_ptr拥有“由new建立起来的单一对象”,默认的delete才可以使用,但是对于数组来说却不适用,所以当shared_ptr是new了一个数组出来的时候必须使用自己定义的delete。

shared_ptr p(new int[10], [](int *p) {
    delete[] p;
});

当然也可以使用unique_ptr提供的辅助函数作为delete:

shared_ptr p1(new int[10], default_delete());

       然而请注意,shared_ptr和unique_ptr处理deleter的方式还是不大一样,例如unique_ptr允许你只传递对应的元素作为template实参,但是这对shared_ptr就不行。

unique_ptr p(new int[10]);
	//shared_ptr pErr(new int[10]);	// 错误
        //此外,对于unique_ptr,必须明确给予第二个template实参,指出你自己的delete:
	unique_ptr pu(new int[10], [](int* p) {
		delete[] p;
	});

       同时,应该注意,shared_ptr不提用operator[],而对于unique_ptr,它有一个针对数组的偏特化版本,该版本提供operator[]取代operator*和operator->。之所以有如此差异是因为unique_ptr在效能和弹性上进行了优化。  

<

你可能感兴趣的:(C/C++,shared_ptr,weak_ptr,unique_ptr,智能指针)