std :: vector插入对象的副本或引用?

Sha*_*hai 10 c++ copy reference vector

假设我有一个动态分配的对象.如果我将它推入STL向量,是否会将引用插入到该向量或该对象的副本中?

这是一个普遍的问题.例如:

class vec {
vector<obj> vec;
void addToVec(obj a) {
    // insert a into vec
 }
  ...
  ...
  ...
 }

obj* a = new obj;
 vec* v = new vec;
 vec.addToVec(a); 
Run Code Online (Sandbox Code Playgroud)

如果我删除v,也会反对死?

iam*_*ind 9

将引用插入到该向量或该对象的副本中吗?

复制(这意味着您class应该可以复制,否则编译错误).

澄清:参考文献无法分配std::vector<>.此外,这里的对象具有更广泛的意义,它可以是普通变量或指针,但std::vector<>只接受副本.

更新:Post C++ 11,大多数标准容器std::move()使用"rvalue baed API方法" 提供对象; 可能无法执行复制的地方.


D.S*_*ley 7

如果您有一个T动态分配的类型对象,并将指向该对象指针推送到a std::vector<T*>,则会推送指针副本.如果取消引用指针并将结果推送到a std::vector<T>,则会生成对象的副本.收藏总是复制.因此,指针集合使指针和类实例集合的副本能够复制实例本身(使用复制结构IIRC).