Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

В чем отличие методов

Не могли бы вы мне подсказать в чем разница между:
template class SelfMap {
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);

Комментариев нет:

Отправить комментарий