簡體   English   中英

為什么我的構造函數涉及 shared_ptr 不正確?

[英]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_ptrshared_ptr被破壞時嘗試刪除該函數,但無法刪除函數。

我想初始化為 nullptr

那么你根本不需要make_shared 只需將其初始化為nullptr (或者,正如評論中所指出的,完全省略初始化,因為nullptrshared_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM