Я считаю, что у вас есть что-то вроде следующего:
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
для освобождения памяти.
Как правило, эти операторы определяются только в тех случаях, когда вы хотите контролировать, как память для динамических объектов этого класса должна выделяться или освобождаться.