Нужно ли перегрузить delete, если у меня есть оператор T * ()? - PullRequest
4 голосов
/ 30 марта 2011

Если у меня есть шаблонный класс A, который содержит указатель, а A имеет неявный оператор преобразования, который будет возвращать этот указатель, нужно ли мне или нужно определить оператор delete для A, если я собираюсь применить delete к объектам этого класса?

Ответы [ 4 ]

5 голосов
/ 30 марта 2011

Вам нужно только определить оператор delete , если вы определите operator new - в этом случае вы в значительной степени должны это сделать.

Это не значит, что что-то не нужно будет удалять ваши A * s - но вам не нужно определять для этого никаких операторов, это будет работать по умолчанию.

2 голосов
/ 30 марта 2011

Я считаю, что у вас есть что-то вроде следующего:

template <typename T>
struct A {
  T * t;
  operator T* () { return t; } 
};

И вы намереваетесь «применить delete к объектам этого класса», поэтому я предполагаю, что вы имеете в виду:

void foo ()
{
  A<int> * p = new A<int>;
  delete p;     // Applying 'delete'
}

Если дело обстоит именно так, то вызов delete удаляет объект и освобождает память, выделенную с помощью 'new' в предыдущей строке, и ответ на ваш вопрос 'no'.

Поскольку вы объявили оператор преобразования для указателя, можно использовать delete для объекта типа A<int> (в противоположность A<int>*). Использование delete будет применяться к результату вызова оператора преобразования:

void foo ()
{
  A<int> a;
  a.t = new int;
  delete a;       // Same as: delete a.operator T*()
}

Основы работы удаления:

Выражение delete p делает две разные вещи. Сначала он вызывает деструктор для объекта, на который указывает p, а затем освобождает память. Если вы определите член operator delete для своего класса, тогда это будет та функция, которая будет использоваться delete p для освобождения памяти.

Как правило, эти операторы определяются только в тех случаях, когда вы хотите контролировать, как память для динамических объектов этого класса должна выделяться или освобождаться.

2 голосов
/ 30 марта 2011

Если ваш класс владеет этим указателем, он должен удалить его в своем деструкторе. Имейте в виду, что перегрузка этого оператора может сбивать с толку, потому что обычный подход для получения указателя на объект заключается в получении его адреса.

0 голосов
/ 30 марта 2011

Нужно ли вам A действительно определить оператор неявного преобразования?Может быть, есть простой метод T* get() const, который возвращает указатель, как это делают интеллектуальные указатели boost и std.Неявное преобразование может вызвать все виды проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...