簡體   English   中英

C++類指針動態數組釋放問題

[英]C++ Class pointer dynamic array deallocate problem

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define ROW 1

class Foo
{
public:
    Foo()
    {
        this->dummy = new unsigned int[100];
    }
    ~Foo()
    {
        delete[] this->dummy;
        this->dummy = NULL;
    }

    unsigned int* dummy;
};

Foo** allocate()
{
    Foo** foo_array = NULL;
    foo_array = new Foo * [ROW]; //Create space for Foo addresses (row)

    for (int i = 0; i < ROW; i++)
        foo_array[i] = new Foo; //Create and allocate Foo for each address space(col)

    return foo_array;
}

int deallocate(Foo* foo_array[ROW])
{
    if (foo_array != NULL)
    {
        for (int i = 0; i < ROW; i++)
            delete foo_array[i];
        delete[] foo_array;
        
        foo_array = NULL;

        return 1;
    }

    return 0;
}

void main()
{
    Foo** foo_array = NULL;

    foo_array = allocate();
    deallocate(foo_array);
    
    if (foo_array != NULL)
        printf("not null something wrong\n");
    system("pause");
}

在 main() 函數中,一旦由 deallocate(Foo* foo_array[ROW]) 函數執行解除分配, foo_array 就應該指向 NULL。

但是,在 deallocate(Foo* foo_array[ROW]) 函數中,

foo_array = NULL;

上面的語法似乎指向 NULL,但是在 main() 函數中, foo_array 並不指向 NULL。

因此,我嘗試在 deallocate(Foo* foo_array[ROW]) 函數中更改上述語法,

foo_array = NULL; => (*foo_array) = NULL;

它會吐出寫訪問沖突錯誤。

哪里出錯了?

正確的語法是foo_array = deallocate (foo_array); 並且您的deallocate應返回NULL

我看不出有任何理由將foo_array聲明為指向指針的指針。 在您的代碼中,您按值傳遞指針。 這意味着您可以更改指針指向的內容,但不能更改指針的值。 您可以使用引用來解決問題。

#include <cstdio>

#define ROW 1

class Foo
{
public:
    Foo()
    {
        this->dummy = new unsigned int[100];
    }
    ~Foo()
    {
        delete[] this->dummy;
        this->dummy = NULL;
    }

    unsigned int *dummy;
};

void allocate(Foo *&foo_array)
{
    foo_array = new Foo[ROW];
}

void deallocate(Foo *&foo_array)
{
    delete[] foo_array;
    foo_array = nullptr;
}

int main()
{
    Foo *foo_array = nullptr;

    allocate(foo_array);
    deallocate(foo_array);
    
    if (foo_array != nullptr)
        printf("not null something wrong\n");
}

當然,您可以使用 STL 容器或智能指針使您的代碼更簡單

暫無
暫無

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

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