[英]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.