簡體   English   中英

在 C++ 中刪除 3d 動態數組

[英]Deleting 3d Dynamic array in c++

我做了一個函數來初始化一個動態 3d 數組

void initialize_array_3d(char ***Array, int size1, int size2, int size3)
{
    Array = new char**[size1];
    for (int t=0; t<size1+1; t++)
    {
        Array[t] = new char *[size2];
        for (int r=0; r<size2+1; r++)
        {
            Array[t][r] = new char [size3];
        }
    }
}

它工作正常,但是當我嘗試使用函數刪除它時

void deinitialize_array_3d(char ***Array, int size1, int size2)
{
    for (int t=0; t<size1+1; t++)
    {
        for (int r=0; r<size2+1; r++)
        {
            delete[] Array[t][r];
        }
        delete[] Array[t];
    }
    delete[] Array;
}

我的程序崩潰了,為什么? 我該如何解決?

在主要:

int main()
{
    char ***Failed;
    initialize_array_3d(Failed, 5, 4, 2);
    deinitialize_array_3d(Failed, 5, 4);
    Failed = nullptr;
    return 0;
}

您正在使用size1 + 1來循環遍歷您的數組而不是size1 ,但由於數組的size1 ,您無法訪問元素size1 在初始化過程中,您可以僥幸逃脫(這是未定義的行為),但是您無法刪除不屬於您的內存,因此您的程序會崩潰。


考慮使用std::vector代替。

對於初學者函數initialize_array_3d是錯誤的。 它至少應該看起來像以下方式

void initialize_array_3d( char ****Array, int size1, int size2, int size3 )
                          ^^^^^^^^^^^^^^
{
    *Array = new char**[size1];

    for ( int t = 0; t < size1; t++ )
                     ^^^^^^^^^
    {
        ( *Array )[t] = new char *[size2];

        for ( int r = 0; r < size2; r++ )
                         ^^^^^^^^^
        {
            ( *Array )[t][r] = new char [size3];
        }
    }
}

即第一個參數應該使用指針間接傳遞。

函數調用可能看起來像

initialize_array_3d( &Failed, 5, 4, 2);
                     ^^^^^^^

否則參數char ***Array是函數的局部變量,函數處理參數的副本。 局部變量的任何更改都不會影響原始參數。

或者您可以將參數聲明為對 pojnter 的引用。 例如

void initialize_array_3d( char *** &Array, int size1, int size2, int size3 )
                          ^^^^^^^^^^^^^^
{
    Array = new char**[size1];

    for ( int t = 0; t < size1; t++ )
                     ^^^^^^^^^
    {
        Array[t] = new char *[size2];

        for ( int r = 0; r < size2; r++ )
                         ^^^^^^^^^
        {
            Array[t][r] = new char [size3];
        }
    }
}

在這種情況下,函數調用可能看起來像

initialize_array_3d( Failed, 5, 4, 2);
                     ^^^^^^  

至於函數deinitialize_array_3d那么它應該看起來像

void deinitialize_array_3d(char ***Array, int size1, int size2)
{
    for ( int t = 0; t < size1; t++ )
                     ^^^^^^^^^ 
    {
        for ( int r = 0; r < size2; r++ )
                         ^^^^^^^^^
        {
            delete[] Array[t][r];
        }
        delete[] Array[t];
    }

    delete[] Array;
}

暫無
暫無

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

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