移动赋值运算符没有移动我的 shared_ptr
Move assignment operator is not moving my shared_ptr
我的移动赋值运算符有一些问题,也许我只是误解了发生了什么。我下面的 SignalHolder
对象旨在保存指向 Signal
对象的共享指针,并在 SignalHolder 被销毁后立即调用其 detach()
方法。由于销毁对象会自动导致信号中断,因此只有一个存在很重要。因此,我使用移动语义来确保只有一个存在。
总之,即使我写了一个移动赋值运算符,它似乎并没有移动我的shared_ptr。如果我在赋值方法的末尾添加断点,*this
和 c
都指向同一个对象。我虽然 std::move
应该将 shared_ptr 移动到 *this
并使用 nullptr 离开 c
?我在这里做错了什么?
class SignalHolder
{
std::shared_ptr<SignalCallbackBase> _target;
inline static int idIdx = 0;
int id;
public:
SignalHolder(std::shared_ptr<SignalCallbackBase> target = nullptr) :
_target(target)
{
id = idIdx++;
qDebug() << "SignalHolder construct " << id;
}
SignalHolder(const SignalHolder&) = delete;
SignalHolder(const SignalHolder&& c) :
_target(std::move(c._target))
{
qDebug() << "SignalHolder move construct " << id;
}
~SignalHolder()
{
qDebug() << "SignalHolder destruct " << id;
detach();
}
SignalHolder& operator=(SignalHolder const&) = delete;
SignalHolder& operator=(SignalHolder const&& c)
{
qDebug() << "SignalHolder assign move " << id;
_target = std::move(c._target);
//Break point here
int j = 9;
}
void detach() {
qDebug() << "SignalHolder detach " << id;
if (_target)
_target->detach();
_target = nullptr;
}
};
SignalHolder makeHolder()
{
auto s = std::make_shared<SignalCallbackBase>();
return SignalHolder(s);
}
int main()
{
SignalHolder a;
a = makeHolder();
}
参数c
声明为const
,不能移动。移动操作应该对要移动的对象进行修改。在 _target = std::move(c._target);
中,调用了复制赋值运算符,但不调用 std::shared_ptr
的移动赋值运算符。 (std::shared_ptr
的移动赋值运算符对非常量进行右值引用,不能绑定到 const
对象。)
您也应该删除 const
限定词。
SignalHolder& operator=(SignalHolder && c)
{
qDebug() << "SignalHolder assign move " << id;
_target = std::move(c._target);
//Break point here
int j = 9;
return *this;
}
顺便说一句:您在 operator=
中丢失了 return 语句。
我的移动赋值运算符有一些问题,也许我只是误解了发生了什么。我下面的 SignalHolder
对象旨在保存指向 Signal
对象的共享指针,并在 SignalHolder 被销毁后立即调用其 detach()
方法。由于销毁对象会自动导致信号中断,因此只有一个存在很重要。因此,我使用移动语义来确保只有一个存在。
总之,即使我写了一个移动赋值运算符,它似乎并没有移动我的shared_ptr。如果我在赋值方法的末尾添加断点,*this
和 c
都指向同一个对象。我虽然 std::move
应该将 shared_ptr 移动到 *this
并使用 nullptr 离开 c
?我在这里做错了什么?
class SignalHolder
{
std::shared_ptr<SignalCallbackBase> _target;
inline static int idIdx = 0;
int id;
public:
SignalHolder(std::shared_ptr<SignalCallbackBase> target = nullptr) :
_target(target)
{
id = idIdx++;
qDebug() << "SignalHolder construct " << id;
}
SignalHolder(const SignalHolder&) = delete;
SignalHolder(const SignalHolder&& c) :
_target(std::move(c._target))
{
qDebug() << "SignalHolder move construct " << id;
}
~SignalHolder()
{
qDebug() << "SignalHolder destruct " << id;
detach();
}
SignalHolder& operator=(SignalHolder const&) = delete;
SignalHolder& operator=(SignalHolder const&& c)
{
qDebug() << "SignalHolder assign move " << id;
_target = std::move(c._target);
//Break point here
int j = 9;
}
void detach() {
qDebug() << "SignalHolder detach " << id;
if (_target)
_target->detach();
_target = nullptr;
}
};
SignalHolder makeHolder()
{
auto s = std::make_shared<SignalCallbackBase>();
return SignalHolder(s);
}
int main()
{
SignalHolder a;
a = makeHolder();
}
参数c
声明为const
,不能移动。移动操作应该对要移动的对象进行修改。在 _target = std::move(c._target);
中,调用了复制赋值运算符,但不调用 std::shared_ptr
的移动赋值运算符。 (std::shared_ptr
的移动赋值运算符对非常量进行右值引用,不能绑定到 const
对象。)
您也应该删除 const
限定词。
SignalHolder& operator=(SignalHolder && c)
{
qDebug() << "SignalHolder assign move " << id;
_target = std::move(c._target);
//Break point here
int j = 9;
return *this;
}
顺便说一句:您在 operator=
中丢失了 return 语句。