[英]Why is my constructor involving a shared_ptr incorrect?
我有一個類,它使用 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
被破壞時嘗試刪除該函數,但無法刪除函數。
我想初始化為 nullptr
那么你根本不需要make_shared
。 只需將其初始化為nullptr
。 (或者,正如評論中所指出的,完全省略初始化,因為nullptr
是shared_ptr
的默認值。)
我有一個類,它使用 shared_ptr 作為成員變量,我想將其初始化為 nullptr。
太好了,什么都不做。 std::shared_ptr
的默認構造函數無論如何都會使指針無效。 你不需要做任何事情。
Example() : myptr(make_shared<Example<T>>), val(0) {}
首先,如果您調用make_shared
那么您可以確定您分配的shared_ptr
不會為空,您正在分配一個新構造的托管對象! 這就像調用new
並用共享指針包裝它一樣,它不會使對象無效。
但如果您確實想調用make_shared
,則需要像常規函數調用一樣添加括號:
myptr(make_shared<Example<T>>(/*arguments*/))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.