在堆栈上创建对象向量? (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>>
,这样您的对象就会自动 delete
d。
或者您可以不使用动态分配,因为它更昂贵且容易出错。
另请注意,您误用了 reserve
。您要么想使用 resize
,要么 reserve
与 push_back
.
配对
我正在创建指向 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>>
,这样您的对象就会自动 delete
d。
或者您可以不使用动态分配,因为它更昂贵且容易出错。
另请注意,您误用了 reserve
。您要么想使用 resize
,要么 reserve
与 push_back
.