[英]C++ Memory management for vector of Objects
我有一些关于Vector的内存管理工作方式的问题/示例。
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的第一个矢量元素上使用了erase()
,所以erase()
释放该内存还是需要在擦除之前手动释放它? 此外,当vec
超出范围,都是foo_vec
在向量vec
自动清理? 谢谢你的帮助。
是否delete()会释放该内存,还是需要在擦除之前手动释放它?
规则: 始终对每个new
使用delete
。 vector
并非没有魔力-它不知道您如何获得该指针,因此它不会删除它,您需要这样做。
另外,当vec超出范围时,vec中的所有foo_vec向量都会自动清除吗?
是的,它们的析构函数被调用,并且它们已被释放。 但是,如果析构函数不delete[] arr;
,则会泄漏内存delete[] arr;
。
顺便提一下,一个好的建议:您的代码违反了封装。 您应该在析构函数和构造函数中分别分配( new
)和free( delete[]
) foo::arr
指向的内存( foo::foo()
和foo::~foo()
)。
最后,一个强制性的问题:为什么foo::arr
本身不是vector<int>
?
如果是
vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;
由于int
只是POD,因此会删除vec1的先前内容。 如果vector
由指向对象的指针而不是整数组成,并且使用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)。 当向量超出范围或删除向量时,将自动调用删除(或delete [])。
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
foo
destructor
不执行此操作(或者在擦除前不手动执行此操作)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.