我有一个类,它使用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_ptr
在shared_ptr
被销毁时尝试删除函数,但无法删除函数。
我想初始化为空点
那你根本不想要make_shared
。只需将其初始化为 nullptr
.(或者,如注释中所述,完全省略初始化,因为nullptr
是shared_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*/))