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)
是的你应该.
你的程序中应该有相应delete
的new
.
但是你的程序不需要动态分配:
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
您在堆上创建的任何对象都new
需要清除delete
.在您的代码中,您实际上是在副本中存储副本.
objList.push_back(*Obj);
Run Code Online (Sandbox Code Playgroud)
这条线一步一步做的是:
Obj
)你不需要在堆上创建这个初始的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)