Определите, где находится к-струна

Как я могу определить, нужно ли мне вызывать «delete []» для указателя или нет в деструкторе моего класса?
Указатель (переменная-член) может указывать на буфер, выделенный в куче или нет в разное время (это может быть литерал в постоянной памяти или литерал, помещенный в стек).
Какой лучший способ решить это?
Нужно ли использовать для этого просто еще один флаг или может быть получить адреса границы кучи и проверить, есть ли между ними адрес буфера?
Или есть более рациональный способ?

1

Решение

Вы не можете определить, находится ли указатель в автоматическом хранилище, в статической памяти или в динамической памяти, просто взглянув на указатель. Вам необходимо сохранить флаг в тот момент, когда вы устанавливаете этот указатель — например, так:

class classWithDynamicData {
private:
bool needToDelete;
char strData[];
public:
classWithDynamicData(int size) : needToDelete(true), strData(new char[size]) {
}
classWithDynamicData(char* data) : needToDelete(false), strData(data) {
}
~classWithDynamicData() {
if (needToDelete) delete[] strData;
}
...
// You need to define a copy constructor and an assignment operator
// to avoid violating the rule of three
};
2

Другие решения

  1. Не используйте динамически распределяемый член (использование std::string вместо char * или же std::vector вместо динамически распределяемого элемента данных) или же
  2. Используйте умные указатели
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector