С вашим обновленным MyClass
, в котором есть конструктор указателей, я полагаю, вы должны написать:
MyClass MyFunction() {
MyClass *ptr = new MyClass;
MyClass retval(ptr);
delete ptr; // the dynamically-allocated object isn't needed any more
return retval;
}
Это безопасно для исключений, поскольку конструктор MyClass не может генерировать, но какобщее правило, которое вы действительно никогда не должны вызывать new
, не помещая результат прямо в умный указатель:
MyClass MyFunction() {
std::unique_ptr<MyClass>(new MyClass);
return MyClass(ptr);
}
В любом случае, это довольно абсурдная ситуация - если вы собираетесь возвращать по значению, естьнет никакой причины вызывать new
вообще:
MyClass MyFunction() {
MyClass tmpvalue;
return &tmpvalue; // doesn't actually return the pointer, just an object
// constructed from it
}
И поскольку значение указателя даже не используется конструктором указателя, вы также можете написать:
MyClass MyFunction() {
return 0; // returns an object constructed from a null pointer
}
В исходном коде вашей цитаты из книги, я предполагаю, что класс Picture
имеет член данных типа P_Node*
, в котором он хранит значение указателя и вызывает delete
для этого указателя в своем деструкторе.Надеемся, что автор также что-то делает с конструктором копирования и оператором назначения копирования Picture
, чтобы предотвратить двойное освобождение после копирования.У меня нет книги, поэтому я не могу проверить свое предположение, но код Picture
должен показать, как это делается.
[Правка: о, это одна из книг Кенига и Му,Они (более чем) компетентны, поэтому, безусловно, их класс Picture
правильно обрабатывает ресурс.Если это не так, то это потому, что это умышленный пример Doing It Wrong.]