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<enable_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