何时使用"删除"?

Lov*_*eTW 5 c++ memory-management

我想存储10个Obj对象objList,但我不知道delete在这种情况下何时适当使用.如果我delete Obj;在下面代码中注明的行中使用,是否Obj仍然存储objList

struct Obj {
    int u;
    int v;
};

vector<Obj> objList;

int main() {
    for(int i = 0; i < 10; i++) {
        Obj *obj = new Obj();
        obj->u = i;
        obj->v = i + 1;
        objList.push_back(*obj);
        // Should i use "delete Obj;" here? 
    }
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 9

是的你应该.

你的程序中应该有相应deletenew.

但是你的程序不需要动态分配:

Obj obj;
obj.u = i;
obj.v = i + 1;
objList.push_back(obj);
Run Code Online (Sandbox Code Playgroud)

另外,你的语法错了 - objList.push_back(*Obj); // should be *obj, not *Obj


Kon*_*rad 9

您在堆上创建的任何对象都new需要清除delete.在您的代码中,您实际上是在副本中存储副本.

objList.push_back(*Obj);
Run Code Online (Sandbox Code Playgroud)

这条线一步一步做的是:

  1. 指向底层堆内存的指针Obj占用(返回对象Obj)
  2. 调用复制构造函数以创建临时副本
  3. 将临时副本存储在集合中

你不需要在堆上创建这个初始的Obj,就像@Luchian Grigore指出的那样,分配本地的栈就足够了.

Obj obj;
objList.push_back(obj);
Run Code Online (Sandbox Code Playgroud)

您不需要在集合中的副本上调用delete,当您删除元素时,STL集合将自己处理此内存,但您仍需要删除原始堆分配的对象.

如果你存储你的对象会更好std::shared_ptr.这样,当删除对Obj的所有引用时,将调用delete.

std::vector< std::shared_ptr< Obj > > vec;
vec.push_back( std::make_shared( new Obj() ) );
Run Code Online (Sandbox Code Playgroud)