TransWikia.com

как освободить память с помощью free()

Stack Overflow на русском Asked by Natal04ka on November 4, 2021

В классе создается структура и указатель на нее.
В конструкторе для структуры выделяется нужная память.
После использования класса нужно освободить память, выделенную для структуры.
Для операций с памятью используются malloc() и free().
Как правильно освободить память, выделенную для структуры?

Создается класс:

class SUSLIK
{
    struct Data 
    {
        int maxInt;         
        double* matrix;     
    };

    struct Data *pData;
public:
    SUSLIK(int max);
    ~SUSLIK();

};

В конструкторе выделяется память для структуры:

SUSLIK::SUSLIK(int max)
{
    pData = (Data *)malloc(sizeof(Data)); // memory allocation
    pData->matrix = (double*)malloc(sizeof(double) * (max + 2) * (max + 2));
}

Теперь нужно в деструкторе освободить память, выделенную для структуры.
Как это правильно сделать, используя функцию free() ?

if (pData) free(pData->matrix); // это не работает

2 Answers

Выделение памяти под массив может оказаться не удачным, поскольку квадрат числа может оказаться слишком большим числом(да и само переданное число), и в памяти может не быть столько свободного места для такого массива. В этом случаи будет выброшено исключение, указатель останется нулевым, а освобождение нулевой памяти, невозможным. Поэтому нужно это проверить и уменьшить размер до тех пор, пока память не будет выделена. На С++ код может выглядеть следующим образом:

class SUSLIK
{
    struct Data
    {
        int maxInt{};
        double* matrix{ nullptr };       
    } *pData;
public:
    SUSLIK(int max) : pData(new Data)
    {        
        size_t N = (max + 2) * (max + 2);
        while (pData->matrix == nullptr) {
            try {
                pData->matrix = new double[N];
            }
            catch (std::bad_alloc&) {
                N /= 2;
            }
        }
    } 
    ~SUSLIK()
    {
        delete[]pData->matrix;
        delete pData;
    }
};

Answered by AR Hovsepyan on November 4, 2021

Вы же работаете с С++ - используйте его идиоматику...

class SUSLIK
{
    struct Data 
    {
        int maxInt;         
        double* matrix;
        Data(int max):matrix(new double[(max+2)*(max+2)]){}
        ~Data() { delete[] matrix; }
    };

    Data *pData;
public:
    SUSLIK(int max):pData(new Data(max)){}
    ~SUSLIK(){ delete pData; }

};

Каждый отвечает за себя :)

Если вы позарез хотите писать на С++, как на С - ну, что-то вроде

class SUSLIK
{
    struct Data 
    {
        int maxInt;         
        double* matrix;
    };

    Data *pData;
public:
    SUSLIK(int max)
    {
        pData = (Data *)malloc(sizeof(Data)); // memory allocation
        pData->matrix = (double*)malloc(sizeof(double) * (max + 2) * (max + 2));
    }
    ~SUSLIK()
    {
        free(pData->matrix);
        free(pData);
    }
};

Answered by Harry on November 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP