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); // это не работает
Выделение памяти под массив может оказаться не удачным, поскольку квадрат числа может оказаться слишком большим числом(да и само переданное число), и в памяти может не быть столько свободного места для такого массива. В этом случаи будет выброшено исключение, указатель останется нулевым, а освобождение нулевой памяти, невозможным. Поэтому нужно это проверить и уменьшить размер до тех пор, пока память не будет выделена. На С++ код может выглядеть следующим образом:
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP