为什么我的构造函数涉及shared_ptr不正确

Why is my constructor involving a shared_ptr incorrect?

本文关键字:ptr 不正确 shared 我的 构造函数 为什么      更新时间:2023-10-16

我有一个类,它使用shared_ptr作为成员变量,我想将其初始化为nullptr。为什么这是不正确的?编译器错误消息是:"删除:无法删除不是指针的对象"。

template<class T>
class Example:
public: 
    Example() : myptr(make_shared<Example<T>>), val(0) {}
private:
    shared_ptr<Example<T>> myptr;
    T val;

我认为这将创建我的shared_ptr并将其初始化为 nullptr。

还有正确的构造函数会是什么样子的?

make_shared<Example<T>>是一个

函数,而不是一个函数调用。初始化函数的shared_ptr没有意义。您收到的错误是因为shared_ptrshared_ptr被销毁时尝试删除函数,但无法删除函数。

我想初始化为空点

那你根本不想要make_shared。只需将其初始化为 nullptr .(或者,如注释中所述,完全省略初始化,因为nullptrshared_ptr的默认值。

我有一个类,它使用shared_ptr作为成员变量,我 想要初始化为空点。

太好了,什么都不做。 无论如何,std::shared_ptr 的默认构造函数会使指针无效。 你不需要做任何事情。

Example() : myptr(make_shared<Example<T>>), val(0) {}

首先,如果您调用make_shared那么您可以确定您分配的shared_ptr不会为空,您正在分配一个新构造的托管对象! 这就像调用new并用共享指针包装它一样,它不会使对象无效。

但是如果你确实想调用make_shared,你需要像在常规函数调用中一样添加括号:

 myptr(make_shared<Example<T>>(/*arguments*/))