我正在创建指向myObject
个对象的临时向量。但我想知道我创建的对象会发生什么......
{
std::vector<myObject *> myVector;
myVector.reserve(5);
for (int i = 0 ; i < 5 ; ++i){
myVector[i] = new myObject();
}
}
我假设在范围的末尾myVector
被销毁并且所有指针都被销毁,但是当我使用关键字new
创建对象时,是否意味着这些对象仍然存在于某个地方在堆上?我应该在范围结束前手动销毁它们吗?
答案 0 :(得分:4)
您应该使用以下
std::vector<std::unique_ptr<myObject>> myVector(5);
for (auto& obj : myVector)
{
obj = std::make_unique<myObject>();
}
这将创建大小为5
的向量,而不是之后必须调整大小。在这方面,你必须使用resize
代替reserve
。
如果你的向量是std::unique_ptr
,那么你不必担心内存管理,当向量超出范围时,指针会自行清理。
答案 1 :(得分:2)
是的,这些对象仍然存在,您必须删除它们。
或者,您可以使用pid of ls -l: 2725
pid of rev: 2726
pid of sort: 2727
pid of first command e.g. ls -l: 2725
pid of last command e.g. sort: 2727
代替,以便您的对象自动pids=...
。
或者您可能不会使用动态分配,因为它更昂贵且容易出错。
另请注意,您滥用CreateCommand
。您要么使用CreateConnection
,要么std::vector<std::unique_ptr<myObject>>
与delete
配对。
答案 2 :(得分:0)
请记住:您需要销毁使用new
创建的每个对象!
这意味着,您的对象不会被销毁,只会被指针销毁。 你需要做这样的事情:
for (int i = 0 ; i < 5 ; ++i){
delete myVector[i];
}
答案 3 :(得分:0)
请记住:每个new
应与delete
“配对”。
所以是的 - 那些对象仍然存在于堆中 - 你有内存泄漏。
创建一个调用delete的循环,或者更改vector的类型以存储std::unique_ptr<myObject>
- 这将自动删除指针。