В C ++ при передаче объекта по значению существуют ли ограничения на то, когда происходит копирование?
У меня есть следующий код (упрощенно):
class A;
class Parent
{
public:
void doSomething(std::auto_ptr<A> a); // meant to transfer ownership.
};
std::auto_ptr<A> a = ...;
a->getParent()->doSomething(a);
Это действует как:
std::auto_ptr<A> a = ...;
std::auto_ptr<A> copy(a);
a->getParent()->doSomething(copy);
Который будет очевидно Segfault, так как a
сейчас ссылается NULL
,
И не как
std::auto_ptr<A> a = ...;
Parent* p = a->getParent();
p->doSomething(a);
Это ожидается?
A: auto_ptr устарела в новых версиях C ++, я рекомендую проверить unique_ptr.
Б: Такое поведение ожидается. Auto_ptr владеет созданной им вещью. Таким образом, если вы хотите правильно передать право собственности с одного auto_ptr на другой, исходный управляемый объект auto_ptrs должен быть нулевым указателем. Хотя я считаю, что эта логика обрабатывается библиотекой std :: auto_ptr, и вам не нужно делать ничего особенного, чтобы получить такое поведение. Если двум auto_ptrs было разрешено управлять одним и тем же объектом, они также попытались бы и освободить память для этого объекта, когда они вышли из области видимости. Это само по себе плохо, но еще хуже то, что если бы один из этих auto_ptrs имел более широкую область действия, он мог бы попытаться сослаться на память, которая больше не содержала рассматриваемый объект, поскольку с тех пор он был освобожден другим auto_ptr, и в этом мы имеем истину хаос. Следовательно, когда право собственности передается, исходный указатель управляемого объекта устанавливается на ноль, и у нас возникает иллюзия безопасности. 🙂
С моей точки зрения, пример не очень хорош по крайней мере по трем причинам.
1) Глядя на код, не видя doSomething Proto, не ясно, что владелец может измениться.
2) Если по малейшей вероятности результат может зависеть от порядка оценки, код не является переносимым или зависящим от реализации и поэтому неприемлемым.
3) Даже если порядок оценки правильный, код может поднять этот точный вопрос от других
разработчики и будут тратить свое время. Читаемость должна быть наивысшим приоритетом.