首頁 >後端開發 >C++ >在 C 中動態分配物件數組時如何避免記憶體問題?

在 C 中動態分配物件數組時如何避免記憶體問題?

Patricia Arquette
Patricia Arquette原創
2024-12-18 06:52:17682瀏覽

How to Avoid Memory Issues When Dynamically Allocating an Array of Objects in C  ?

動態分配物件陣列

使用包含動態分配陣列的物件時,建立這些物件的整個陣列可能會帶來挑戰。使用像這樣的簡單方法:

A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i) {
    arrayOfAs[i] = A(3);
}

會導致記憶體問題,因為循環中破壞的 A 物件會刪除其內部 myArray 數組,從而使 arrayOfAs 的數組元素無效。

要避免這些問題問題,理解「4 規則」(或 C 11 中擴展的「5 規則」)對於包含 raw的類別至關重要指標:

  1. 建構子
  2. 析構函式
  3. 複製建構子
  4. 賦值運算子
  5. 移動建構子(C 11)
  6. 移動作業(C 11)

如果沒有定義,編譯器會產生這些方法自己的版本,可能不適合原始指標。

要解決上述錯誤,最低要求為包含指向數組的指針的類包括:

class A {
    size_t mSize;
    int* mArray;
public:
    A(size_t s = 0) {mSize=s;mArray = new int[mSize];}
    ~A() {delete [] mArray;}

    A(A const& copy) {
        mSize = copy.mSize;
        mArray = new int[copy.mSize];
        // Handle copying of integers/other members
    }

    A& operator=(A other) {
        std::swap(mArray, other.mArray);
        std::swap(mSize, other.mSize);
        return *this;
    }
};

或者,使用std::vector 等標準容器可以簡化過程,因為它們處理內存自動管理:

class A {
    std::vector<int> mArray;
public:
    A(){}
    A(size_t s) :mArray(s)  {}
};

以上是在 C 中動態分配物件數組時如何避免記憶體問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn