当前位置:   article > 正文

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

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

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>(...);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/209055
推荐阅读
相关标签
  

闽ICP备14008679号