使用 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 创建矢量元素无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章