gpt4 book ai didi

对象 vector 的 C++ 内存管理

转载 作者:太空宇宙 更新时间:2023-11-04 16:22:36 24 4
gpt4 key购买 nike

我有几个关于 Vectors 的内存管理如何工作的问题/示例。

    vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;

在这种情况下,vec1 的旧内存现在无法访问。这里仍然是内存泄漏,还是 vec2 的旧内存会意识到没有任何引用它并被清理掉?

另一个例子

struct foo
{
vector<int> foo_vec(50);
int* arr;
}


void myFunction()
{
vector<foo> vec(10);
vec[0].arr = new int[50];
vec.erase(vec.begin());
}

由于我在包含分配内存的 arr 的第一个 vector 元素上使用了 erase(),所以 erase() 释放了该内存还是我需要释放它在删除之前手动?此外,当 vec 超出范围时,是否会自动清除 vec 中的所有 foo_vec vector ?感谢您的帮助。

最佳答案

如果是

vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;

vec1 的先前内容被删除,因为 int 只是一个 POD。如果 vector 由指向对象的指针而不是 int 组成,并且这些指针是用 new 分配的,那么您必须在分配之前删除这些指针指向的内容,否则您最终会你的第二个例子显示内存泄漏:

vector<foo> vec(10);
vec[0].arr = new int[50];
vec.erase(vec.begin()); // this will *not* call delete on vec[0].arr

通常,为了使事情变得更简单,您通常会使用智能指针,例如唯一指针(或例如 boost::shared_array/scoped_array)。当 vector 超出范围或您删除 vector 时,将自动调用删除(或删除 [])。

struct foo
{
std::vector<int> foo_vec(50);
std::unique_ptr<int[]> arr;
}
...
vec[0].arr.reset(new int[50]);
vec[0].arr[12] = 42;
...
vec.erase(vec.begin()); // this will call delete[] on vec[0].arr

关于对象 vector 的 C++ 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15240449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com