簡體   English   中英

對象向量的C ++內存管理

[英]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
  1. 當然會被清洗。
  2. 否,如果foo destructor不執行此操作(或者在擦除前不手動執行此操作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM