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

时间:2017-02-05 17:30:57

标签: c++ c++11 smart-pointers

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

    <div class="form-inline clearfix">
  <div class="nested-fields">
    <%= f.input :cow_id, :input_html => { :cow_id => :cow }  %>
    <%= f.input :quantity, input_html: {class: "form-input form-control"} %>
    <%= link_to_remove_association "Supprimer", f, class: "form-button btn btn-default" %>
  </div>
</div>

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

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

2 个答案:

答案 0 :(得分:3)

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

  

我想初始化为nullptr

然后你根本不需要make_shared。只需将其初始化为nullptr即可。 (或者,正如评论中指出的那样,完全省略了初始化,因为nullptrshared_ptr的默认值。)

答案 1 :(得分:0)

  

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

太好了,什么都不做。 PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mysql.so' - /usr/lib/php/20151012/mysql.so: undefined symbol: _zend_list_find in Unknown on line 0. 的默认构造函数无论如何都会使指针无效。你不需要做任何事情。

  

std::shared_ptr

首先,如果您致电Example() : myptr(make_shared<Example<T>>), val(0) {},那么您可以确定指定的make_shared 不会为空,您正在分配新构建的托管对象!它就像调用shared_ptr并用共享指针包装它一样,它不会使对象无效。

但如果您确实要调用new,则需要像常规函数调用一样添加括号:

make_shared