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

create vector of objects on the stack ? (c++)

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

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

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

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

记住:您需要销毁使用 new!

创建的每个对象

这意味着,您的对象没有被销毁,只有指针。 你需要做这样的事情:

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

记住:每个 new 应该是 'paired' 和 delete

所以是的 - 那些对象保留在堆中 - 你有内存泄漏。

要么创建一个调用 delete 的循环,要么更改要存储的向量类型 std::unique_ptr<myObject> - 这将自动删除指针。

您应该使用以下内容

std::vector<std::unique_ptr<myObject>> myVector(5);
for (auto& obj : myVector)
{
    obj = std::make_unique<myObject>();
}

这将创建大小为 5 的矢量,而无需事后调整它的大小。在这一点上,您将不得不使用 resize 而不是 reserve.

如果你的向量属于 std::unique_ptr,那么你不必担心内存管理,当向量超出范围时指针会自行清理。

是的,那些对象仍然存在,您必须删除它们。

或者您可以使用 std::vector<std::unique_ptr<myObject>>,这样您的对象就会自动 deleted。

或者您可以不使用动态分配,因为它更昂贵且容易出错。

另请注意,您误用了 reserve。您要么想使用 resize,要么 reservepush_back.

配对