在构造函数中使用什么而不是make_shared_from_this?

时间:2015-10-08 11:23:23

标签: c++ constructor

我需要在全局列表中注册对象。我知道我不能在构造函数中使用make_shared_from_this - 我该使用什么呢?

vector<shared_ptr<A> > alpha;

struct A : enable_shared_from_this<A>
{
   int x;
   A():x(9)
   {

       //alpha.push_back(shared_from_this());
       //alpha.push_back(shared_ptr<A>(this));
   }

};

1)先推回会导致崩溃:

  

ibc ++ abi.dylib:以类型为std :: __的未捕获异常终止1 :: bad_weak_ptr:bad_weak_ptr

2)第二次推回会导致分段错误

2 个答案:

答案 0 :(得分:3)

您无法使用构造函数中的<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>,而您实际上并不需要shared_from_this。您可以编写类似shared_from_this函数的内容。

create

将构造函数放在私有位置并使用来自How do I call ::std::make_shared on a class with only protected or private constructors?

的任何技巧

答案 1 :(得分:2)

全局向量是用于列出内存中的所有对象还是实际上是从向量中删除对象。在后来的案例中,ForEveR给出了一个很好的答案。在前一种情况下,如果代码可以工作,那么您创建的shared_ptr都不会被删除,直到程序结束,因为它们存储在全局向量中。在这种情况下,只需保持简单并使用旧样式指针并在构造函数中添加它们并在析构函数中删除。为了提高效率,更改矢量数据类型会更好。如,

#include<iostream>
#include<memory>
#include<unordered_set>

class A;
std::unordered_set<A*> alpha;

class  A{
public:
  A(): x(9)
  {
    alpha.insert(this);
  }

  ~A(){
     alpha.erase(this);
  }

private:
  int x;
};

示例测试:

int main(){
  std::shared_ptr<A> a= std::make_shared<A>();
  std::cout << "Number of objects: " << alpha.size() << std::endl;  
  {
    std::shared_ptr<A> a1= std::make_shared<A>();
    std::shared_ptr<A> a2= std::make_shared<A>();
    std::cout << "Number of objects: " << alpha.size() << std::endl;
  }
  std::cout << "Number of objects: " << alpha.size() << std::endl;  
}

Number of objects: 1
Number of objects: 3
Number of objects: 1