Не могли бы вы мне подсказать в чем разница между:
template
const Proxy operator[] (Key key)
{
return Proxy(*this, key);
}
//и
//@VladD исправил
Proxy* operator[] (Key key)
{
Proxy *p =new Proxy(*this, key);
return p;
}
//или же
const Proxy operator[] (Key key)
{
Proxy p(*this, key);
return p;
}
};
Если уточнить, мне интересно:
1) При return Proxy(*this, key); как происходит уничтожение объекта и при каких условиях? Возможно ли что я его потеряю, и он засорит память?
2) При return p; как тут уничтожается объект и уничтожается ли?
3) При указателе, можно ли самому уничтожить объект?
Цель данных экспериментов у меня была, выяснить, можно ли при одинаковых ключах вызывать один и тот же прокси класс. И как это сделать если ключей будет много.
Буду очень рад примеру и/или объяснению.
Ответ
return Proxy(*this, key);
Создаётся новый объект №1 на стеке, и возвращается как результат. Объект копируется в принимающую переменную (таким образом, там создаётся ещё один объект №2) при помощи конструктора копирования. Объект №1 уничтожается.
Proxy *p=Proxy(*this, key); return p;
Создаётся новый объект в куче, указатель на него возвращается из функции. Объект не умрёт сам, пока вы его не «уничтожите» вручную.
Объявление функции
Proxy operator[] (Key key)
в этом случае не покатит, т. к. у p тип Proxy*, а не Proxy
Если у вас есть указатель на объект, выделенный в куче при помощи new, вы можете уничтожить при помощи delete. Если объект не выделен в куче, его удалить нельзя. Если объект выделен в куче при помощи new[] или malloc, его нужно освобождать при помощи delete[] или free
Как правильно подсказывает @Harry, в пункте 2 для получения указателя вам нужно использовать new
Proxy *p = new Proxy(*this, key);
Комментариев нет:
Отправить комментарий