C++ 在构造器中,用什么来代替使_共享_?

C++ 在构造器中,用什么来代替使_共享_?,c++,constructor,C++,Constructor,我需要在全局列表中注册对象。我知道我不能在构造函数中使用make_shared_from_-我应该使用什么 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_p

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

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));
   }

};
向量alpha;
结构A:从\u中启用\u共享\u
{
int x;
A():x(9)
{
//alpha.push_back(从_this()共享_);
//alpha.推回(共享的ptr(本));
}
};
1) 第一次推回将导致碰撞:

ibc++abi.dylib:以std::\uuuu 1::bad\u-weak\u-ptr:bad\u-weak\u-ptr类型的未捕获异常终止


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

您不能使用构造函数中的
shared\u this
,实际上您不需要这里的
shared\u this
。您可以编写类似于
create
函数的内容

vector<shared_ptr<A> > alpha;
// in struct A
static shared_ptr<A> create()
{
   shared_ptr<A> pointer = make_shared<A>();
   alpha.push_back(pointer);
   return pointer;
}

vector是指列出内存中所有对象的全局向量,还是从向量中删除对象。在后来的案例中,ForEveR给出了一个很好的答案。在前一种情况下,如果代码可以工作,那么在程序结束之前,您创建的共享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;
};
#包括
#包括
#包括
甲级;
std::无序_集α;
甲级{
公众:
A():x(9)
{
α.插入(本);
}
~A(){
alpha.擦除(这个);
}
私人:
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
intmain(){
std::shared_ptr a=std::make_shared();

std::你有没有考虑过使用向量来代替呢?(这取决于是否有alpha-vector来阻止破坏)我从来没有见过一个标准函数成为定制类的朋友。可以吗?