在堆栈上创建对象的向量? (C ++)

时间:2015-06-22 14:28:09

标签: c++ vector heap-memory

我正在创建指向myObject个对象的临时向量。但我想知道我创建的对象会发生什么......

{
    std::vector<myObject *> myVector;
    myVector.reserve(5);

    for (int i = 0 ; i < 5 ; ++i){
        myVector[i] = new myObject();
    }
}

我假设在范围的末尾myVector被销毁并且所有指针都被销毁,但是当我使用关键字new创建对象时,是否意味着这些对象仍然存在于某个地方在堆上?我应该在范围结束前手动销毁它们吗?

4 个答案:

答案 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> - 这将自动删除指针。