C++ 在构造器中,用什么来代替使_共享_?
我需要在全局列表中注册对象。我知道我不能在构造函数中使用make_shared_from_-我应该使用什么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
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来阻止破坏)我从来没有见过一个标准函数成为定制类的朋友。可以吗?