C++智能指针——初始化

    int* a = new int();

	shared_ptr<int> ptr(a);

	shared_ptr<int> ptr1 = make_shared<int>(12);
		
	shared_ptr<int> ptr2(new int());

	shared_ptr<int> ptr3(ptr1);

智能指针是你在堆栈上声明的类模板,并可通过使用指向某个堆分配的对象的原始指针进行初始化。 在初始化智能指针后,它将拥有原始的指针。 这意味着智能指针负责删除原始指针指定的内存。 智能指针析构函数包括要删除的调用,并且由于在堆栈上声明了智能指针,当智能指针超出范围时将调用其析构函数,尽管堆栈上的某处将进一步引发异常。

通过使用熟悉的指针运算符(-> 和 *)访问封装指针,智能指针类将重载这些运算符以返回封装的原始指针。

请始终在单独的代码行上创建智能指针,而绝不在参数列表中创建智能指针,这样就不会由于某些参数列表分配规则而发生轻微泄露资源的情况。

1.通过new构造,涉及到两次内存分配,第一次是通过new为数据对象分配内存,第二次是构造一个shared_ptr的管理对象,管理对象记录了强引用(shared_ptr)计数,弱引用(weak_ptr)计数,以及数据对象的地址。当管理对象发现强引用计数为0时,释放数据对象的内存,当管理对象发现弱引用计数为0时,释放管理对象的内存。

2.通过make_shared构造,必须要有公共构造,只分配一次内存,这一块内存里既包括管理对象,也包括数据对象。由于是在一块内存里,所以即使强引用计数已被清零,但如果弱引用计数还没有清零,那么也无法释放这一块内存,直到弱引用计数清零时,这一块内存(包括管理对象和数据对象)才能被释放。

如果make_shared没有公共构造那怎么解决呢?

方法1:

class Obj {

struct enable_shared : public Obj {
    enable_shared(...) : Obj(...) { }
};
 
void someFunction() {
    auto ptr = std::make_shared(...);
}

private:
Obj(…);

};

方法2:

std::shared_ptr pA{new Obj()};

//这是国外的网友的解决办法

https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const?rq=1

你可能感兴趣的:(C++智能指针,c++,开发语言)