簡體   English   中英

嘗試處理嵌套對象/結構和動態 arrays 時出現 Memory 泄漏或 memory 錯誤。 可能的 Xcode/malloc 問題

[英]Memory leak or memory error when trying to handle nested objects/structs & dynamic arrays. Possible Xcode/malloc issue

When I compile with Xcode and run this, I get the error, at least 100 times in a row, malloc: *** error for object 0x100180: double free , with the debugger pointing to line C . 奇怪的是,在我從中提煉出來的代碼中,發生了完全相同的錯誤,但調試器指向了line B的等價物。 我試過但無法重現。

如果我刪除line A ,代碼可以工作,但我得到一個主要的 memory 泄漏,導致程序在大約 1 分鍾內崩潰。 刪除line C可以解決問題,但不是有效的解決方案,因為a_class沒有適當的析構函數。

#include <iostream>
#include <vector>

struct a_struct
{
    int* dynamic_array;
    a_struct(int length) {dynamic_array = new int [length];}
    a_struct() : dynamic_array(NULL) {}
    ~a_struct() { if (dynamic_array != NULL) {delete [] dynamic_array;} }  //Line A
};

class a_class
    {
    public:
        a_struct* the_structs;
        a_class() {Init();}
        a_class(a_class const & origin) {Init();}
        void Init(){
            the_structs = new a_struct [10];                              //Line B 
            for(int q=0; q<10; q++)
                the_structs[q] = a_struct(7);}
        ~a_class() { if (the_structs != NULL) {delete [] the_structs;} }  //Line C
    };

int main () 
{
    std::vector <a_class> the_objects;
    for(int q=0; q<10; q++)
        the_objects.push_back(a_class());

    while(1)
        for(int q=0; q <10; q++)
            for(int w=0; w <10; w++)
                the_objects[q].the_structs[w] = a_struct(7);
}

修復 a_struct 和 a_class 以具有正確的復制構造函數和賦值運算符。 如果還有問題就回來。

確保您的所有課程始終遵循3 規則 我最近似乎經常鏈接到那個頁面。

問題是您正在嘗試進行自己的 memory 管理。

使用內置容器:

struct a_struct
{
    std::vector<int>    dynamic_array;
    a_struct(int length) : dynamic_array(length){}
    a_struct()           : dynamic_array() {}
};

class a_class
{
    public:
        std::vector<a_struct>   the_structs;
        a_class()                       {Init();}
        a_class(a_class const & origin) {Init();}
        void Init()
        {
            the_structs.resize(10); 
            for(int q=0; q<10; q++)
                the_structs[q] = a_struct(7);
        }
};

問題是a_struct沒有正確的復制構造函數和operator = 因此,一次有兩個a_struct::dynamic_array指向同一個 memory 位置,並且都將調用delete[] dynamic_array; 在析構函數中。 因此,雙重刪除

永遠記住,只要你在class中有一個行指針,你就應該做一個深拷貝(復制指針指向的內容)而不是淺拷貝(只是地址)。

在您的情況下,您可以像這樣更改定義:

struct a_struct
{
  int length_;  //<<--- add this for record
  int* dynamic_array;
  a_struct(int length) : length_(length) {dynamic_array = new int [length_]; }
  a_struct() : dynamic_array(NULL) {}
  a_struct(const a_struct &copy)  // <<--- copy ctor
  {
    do_copy(copy);
  }
  a_struct& operator = (const a_struct &copy)  // <<--- assignment operator
  {
    delete[] dynamic_array; // clear earlier array
    do_copy(copy);
    return *this;
  }
  ~a_struct() { if (dynamic_array != NULL) {delete [] dynamic_array;} }  //Line A

  void do_copy (const a_struct &copy)
  {
    // do necessary null checks for "copy"
    dynamic_array = new int[length_ = copy.length];
    memcpy(dynamic_array, copy.dynamic_array, length_);
  }
};

您對任何此類class采取相同的預防措施。

問題是a_struct中隱式生成的復制構造函數不會進行深度復制,但析構函數始終假定為每個實例分配了 memory。 您需要為它創建一個復制構造函數來進行深度復制。 但更好的是只使用std::vector而不是 new 和 delete。 然后,您不必擔心要記住保持所有構造函數正確。

此外, a_class的復制構造函數實際上並不復制 object。 當它不支持預期的復制語義時,這幾乎肯定會在某個時候給您帶來問題。

暫無
暫無

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

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