我需要在全局列表中注册对象。我知道我不能在构造函数中使用 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)第一次推回会导致崩溃:



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

最佳答案

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

#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

关于c++ - 在构造函数中代替 make_shared_from_this 有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33014333/

10-12 02:34