在对valgrind进行了大量研究之后,我得出结论,std::vector会生成一个你想要推回的对象的副本。
这是真的吗?vector不能在没有副本的情况下保留对象的引用或指针?!
谢谢
在对valgrind进行了大量研究之后,我得出结论,std::vector会生成一个你想要推回的对象的副本。
这是真的吗?vector不能在没有副本的情况下保留对象的引用或指针?!
谢谢
当前回答
与c++ 11相关的是emplace家族成员函数,它允许您通过将对象移动到容器中来转移对象的所有权。
习惯用法是这样的
std::vector<Object> objs;
Object l_value_obj { /* initialize */ };
// use object here...
objs.emplace_back(std::move(l_value_obj));
左值对象的move很重要,否则它将被转发为引用或const引用,并且不会调用move构造函数。
其他回答
是的,std::vector存储副本。vector如何知道对象的预期生命周期是什么?
如果你想要转移或共享对象的所有权,可以使用指针,可能是像shared_ptr这样的智能指针(在Boost或TR1中找到)来简化资源管理。
与c++ 11相关的是emplace家族成员函数,它允许您通过将对象移动到容器中来转移对象的所有权。
习惯用法是这样的
std::vector<Object> objs;
Object l_value_obj { /* initialize */ };
// use object here...
objs.emplace_back(std::move(l_value_obj));
左值对象的move很重要,否则它将被转发为引用或const引用,并且不会调用move构造函数。
vector总是复制vector中存储的内容。
如果你保存了一个指针向量,那么它会复制指针,但不会复制指针所指向的实例。如果你在处理大型对象,你可以(也许应该)总是使用指针向量。通常,使用适当类型的智能指针向量有利于安全,否则处理对象生命周期和内存管理可能会很棘手。
为什么要进行大量的调查才发现这一点! 用一些简单的代码证明一下就可以了。
std::vector<std::string> vec;
{
std::string obj("hello world");
vec.push_pack(obj);
}
std::cout << vec[0] << std::endl;
如果打印"hello world",则该对象必须已被复制
如果你不想要副本;然后,最好的方法是使用指针向量(或用于相同目标的其他结构)。 如果你想要复印件;直接使用push_back()。 你没有其他选择。