使用 boost::make_shared 创建矢量元素无法正常工作

Posted

技术标签:

【中文标题】使用 boost::make_shared 创建矢量元素无法正常工作【英文标题】:Creating vector elements using boost::make_shared not working correctly 【发布时间】:2014-05-16 23:39:49 【问题描述】:

我有大量的对象要创建,它们都将存储在一个特定的向量中。所以我这样做了:

std::vector<boost::shared_ptr<MyClass>> t;
t.resize(5000);

然后我编写了一个脚本来生成用于创建所有 5000 个对象的 C++:

t[0] = boost::make_shared<MyClass>(4659);

t[1] = boost::make_shared<MyClass>(45029);

t[2] = boost::make_shared<MyClass>(2731);
.
.
t[4999]....

但是,最后我循环遍历,似乎我没有正确构造对象:

for(boost::shared_ptr<MyClass> s : t)
    //I cannot see the data members for s when debugging here
    s->doSomething(x);

似乎s 没有被实例化。

我是否误用了boost::make_shared 而我实际上并没有创建对象?

【问题讨论】:

SSCCE好吗?我看不出您的代码有任何明显错误。 @Praetorian 唯一没有放的代码部分是 MyClass 的定义。这是继承层次结构的一部分,我为父类和 MyClass 创建了默认构造函数——默认构造函数什么都不做。 那么创建一个演示问题的测试用例应该真的很容易:) 好的-解决了。 @Praetorian 你可能会得到所有的功劳。我将向量传递给一个函数,用脚本化的 C++ 填充它,但我忘了传递引用:) 【参考方案1】:

您不需要为此生成 C++ 代码。给定你的例子,你应该简单地生成一个包含整数的文本文件来构造项目,然后这样做:

vector<shared_ptr<MyClass>> t;
for (int x; cin >> x; ) 
    t.push_back(make_shared<MyClass>(x));

当然,您可以使用任何 istream 来代替 cin

如果你这样做,我保证你的向量中不会有任何“缺失”的元素。

【讨论】:

如果你打电话给vector::reserve,这甚至会比原来的更快。 当然,如果你知道有多少元素即将到来。如果您不这样做,则可能不值得担心,因为复制 shared_ptrs 的成本并不太高。是的,您可以读取文件一次以获取计数,但这可能是过早的优化。

以上是关于使用 boost::make_shared 创建矢量元素无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 io_service 中解决这个问题?

终止正在运行的 boost 线程

需要使用互斥锁显式定义的复制构造函数

css 三角矢印

在医学中啥是矢状面,冠状面,横断面

东风谷早苗的角色形象