Освобождение памяти
{
public:
Object& method();
...
}
Object& Object::method()
{
Object* Obj=new Object(...);
//Модифицируем объект *Obj и возвращаем его же
return *Obj;
}
void main()
{
Object X(...), Y(...);
Y=X.method();
}
Y = temp;
delete &temp;
Но я бы от такого кода избавлялся. Ибо если есть конструктор копирования, то можно написать
{
Object Obj(...);
//Модифицируем объект Obj и возвращаем его же
return Obj;
}
и это будет гораздо правильнее, ибо метод перестает требовать от своего пользователя знание этой "особенности".
На мой взгляд, код немного сложнее, чем он мог бы быть. А в чем состоит конечная цель? Может легче возвращать из функции указатель, а не ссылку? Опять же непонятно, что вернет функция, если вдруг вызов new закончится неудачей?
Может быть и сложней, чем есть на самом деле... Это целиком и полностью зависит от преследуемой цели...
Конечная цель состоит в том, чтобы приватные данные, изменяемые в методе method(), объекта X остались без изменений, но все изменения сохранились в объекте Y:
Выше упомянутый класс "работает" стабильно, правильно, без ошибок, если рассматривать с точки зрения его прямого назначения... за исключением утечки памяти, что само собой - не есть хорошо... И поэтому на такие "дырки" нужно сразу ставить "заплатки", а не оставлять на потом...
Об этом я тоже думал... И такой вариант также будет реализован в классе... И работать он будет без проблем... Задача состоит в том, чтобы реализовать максимально удобный и надёжный класс...
Это почему же?
Надежнее возвращать объект (правда произойдет лишнее копирование).
Классически возвращается ссылка на константный объект, но тут нечестными приемами можно его изменить, кроме того этот объект нужно будет где-то хранить.
Я бы оставил только один метод, который принимает ссылку на объект, который будет меняться.
Типа, если возвращается ссылка то можно юзать методы объекта через '.'(1 знак), а если указатель - через '->'(2 знака) ?
Если Object имеет только параметризованные конструкторы, делайте фабрику и сплавляйте ей создание/удаление объектов (можете и с подсчётом ссылок). Но я не уверен, что вам это нужно.
P. S. Кстати, лучше бы, наверное, даже Y.method(X). Зависит, конечно, от задачи, но есть соглашения: обычно используют void method(const Object &), а не void method(Object &) const. Хоть это и не принципиально. Главное, чтобы у вас путаницы не возникало.
Вот как раз этого я и хочу избежать...
Целиком и полностью согласен... Но и тут начинаются проблемы со всеми вытекающими последствиями...
Потому что это (Object* Obj=new Object(...); )временный объект, занимаемая память под который должна быть освобождена...
Я это как вариант даже не рассматривал... К тому же, если возвращается указатель, то объект, к которому присваивается этот указатель должен быть таким же указателем - иначе не прокатит... В этом случае нужно воспользоваться перегрузкой оператора ->... Но делать я этого не собираюсь: пускай семантика объектов и указателей на объекты остаётся прежней...
Потому что это (Object* Obj=new Object(...); )временный объект, занимаемая память под который должна быть освобождена...
Что подразумеваешь под временным объектом указатель или тот, который создастся в куче?
Потому что если указатель - то он просто скопируется при возврате из функции.
... память на который он указывает будет очищена, что приведёт к ошибкам...
переменная просто скопируется при возврате из функции.
И все будет Ок.
Это применительно к языку С++.
Я с Вами полностью согласен!!! Мы отходим от главной цели... Задача состоит в том, чтобы эту память очистить, после того, как скопируем её в другой объект...
Вот за дельный совет спасибо!!! Попробуем...
Надежнее возвращать объект (правда произойдет лишнее копирование).
Если компилятор умеет NRVO - то не произойдет.