所以我写了一些代码来尝试c ++ std库附带的智能指针。为此,我创建了一个测试类MyClass
,该类在销毁时会生成控制台输出。我的代码如下:
std::unique_ptr<MyClass> getMyClassPtr(int a = 0, char b = 'a', double c = 1.1)
{
std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(MyClass(a, b, c));
return ptr;
}
int main()
{
std::unique_ptr<MyClass> pMyClass = getMyClassPtr();
if (pMyClass)
std::cout << "MyClass Values:\na = " << pMyClass->getA() << "\nb = "
<< pMyClass->getB() << "\nc = " << pMyClass->getC() << "\n";
}
现在我偶然发现,MyClass
的析构函数是在main
的结尾处调用的,但也在getMyClassPtr()
的末尾被现在为空的指针调用了。
哪个物体在这里被破坏?
对我来说,对象的析构函数被调用但并没有真正消失似乎很奇怪。是否正在复制对象?
答案 0 :(得分:0)
getMyClassPtr()
应该返回如下:std::move(ptr);
否则ptr
会在getMyClassPtr
的范围达到时删除。
您还可以重构函数以将其作为参考返回,然后std :: move不是强制性的,但这不是一个好习惯。
std::unique_ptr<MyClass> getMyClassPtr(int a = 0, char b = 'a', double c = 1.1)
{
return std::move(std::make_unique<MyClass>(MyClass(a, b, c)));
}