Как я могу определить, нужно ли мне вызывать «delete []» для указателя или нет в деструкторе моего класса?
Указатель (переменная-член) может указывать на буфер, выделенный в куче или нет в разное время (это может быть литерал в постоянной памяти или литерал, помещенный в стек).
Какой лучший способ решить это?
Нужно ли использовать для этого просто еще один флаг или может быть получить адреса границы кучи и проверить, есть ли между ними адрес буфера?
Или есть более рациональный способ?
Вы не можете определить, находится ли указатель в автоматическом хранилище, в статической памяти или в динамической памяти, просто взглянув на указатель. Вам необходимо сохранить флаг в тот момент, когда вы устанавливаете этот указатель — например, так:
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
};
std::string
вместо char *
или же std::vector
вместо динамически распределяемого элемента данных) или же