簡體   English   中英

C ++正確地釋放具有底層連續內存的多維數組

[英]C++ Properly deallocate multidimensional array with underlying contiguous memory

我有一個為3d數組分配內存的函數。 目的是確保內存是連續的,但也具有a[k][j][i]語法的便利性:

double *** allocate_3d(const int& sz, const int& sy, const int& sx){
    double * aMem = new double[sz*sy*sx];
    double *** array = new double**[sz];
    for(int k=0; k<sz; k++){
        array[k] = new double*[sy];
        for(int j=0; j<sy; j++){
            array[k][j]= aMem + k*sy*sx + j*sx;
        }
    }
    return array;
}

假設我這樣調用函數

x   = allocate_3d(wdz,wdy,wdx);

我該如何正確地釋放x? 我嘗試了以下方法:

void delete_3d(double *** array, const int& sz, const int& sy, const int& sx){
    for(int k=0; k<sz; k++){    
        for(int j=0; j<sy; j++){
            delete[] array[k][j];
        }
        delete[] array[k];
    }
    delete[] array;
}

但是運行Valgrind會產生錯誤,並且似乎表明內存未正確釋放。

實際上應該是這樣的:

void delete_3d(double *** array, const int& sz, const int& sy, const int& sx) {
    // first, restore the pointer to the actual aMem
    double * aMem = array[0][0];
    // only one dimension was allocated in the loop,
    // so only one loop should be deallocating things
    for(int k = 0; k < sz; k++) {
        delete [] array[k];
    }
    delete[] array;
    delete[] aMem;
}


更好的解決方案

包裝std::vector可以同時獲得:連續的內存和合理簡單的訪問語法,並且沒有額外的數組,這對內存,性能和維護都更好:

class Array3d {
public:
    Array3d(size_t sx, size_t sy, size_t sz)
        : m_sx(sx), m_sy(sy) {
        m_array.resize(sx * sy * sz);
    }

    // Can't overload operator[] with more that one parameter
    // so we'll have to do with operator()
    double &operator()(size_t x, size_t y, size_t z) {
        size_t index = x * m_sx * m_sy + y * m_sy + z;
        return m_array[index];
    }

private:
    size_t m_sx, m_sy;
    std::vector<double> m_array;
};

用法示例:

Array3d array(3, 3, 3);
array(0, 1, 2) = 3.14;

暫無
暫無

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

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