簡體   English   中英

不存在將“啞指針”轉換為“智能指針”的合適構造函數

[英]No suitable constructor exists to convert from “dumb pointer” to “smart pointer”

struct A
{
    A(int a);
};

struct B
{
    B();
    void b(std::shared_ptr<A> a);
};

int main()
{
    A a(1);
    B b;
    b.b(&a);
}

所以我得到了這個錯誤,對不起,這是我第一次使用智能指針!

錯誤:

不存在將"A *"轉換為"std::tr1::shared_ptr<A>"的合適構造函數

我該如何解決這個問題?

智能指針的全部意義在於擁有所有權。 也就是說,負責釋放指向它的任何東西。 試圖告訴它管理已經由完全不同的系統管理的東西根本沒有意義。

在您的情況下, a已經被自動管理,為什么還要由智能指針管理? 即使這有效,您也只是將自己設置為刪除它兩次,即 UB。

要么給它擁有的東西,比如new A(1) ,要么改變b來操作它不擁有的東西。

其他人已經對您的代碼的設計錯誤大發雷霆,但不是代碼甚至無法編譯的真正問題。 shared_ptr有一個接受原始指針的構造函數,但它被標記為explicit ,這意味着您必須顯式寫出您想要構造一個shared_ptr實例。 您的 function 調用嘗試的是隱式執行該構造,由於顯式關鍵字,這是不允許的。

以下將編譯但給出未定義的行為,因為shared_ptr將(嘗試) delete駐留在堆棧上且不可刪除的 object:

b.b(shared_ptr<A>(&a)); // explicit construction

shared_ptr的一個特殊特性是您可以向構造函數傳遞一個刪除器,當應該刪除擁有的指針時將調用該刪除器。 您可以只編寫和使用“noop”刪除器,它什么都不做; 以下不會調用未定義的行為,也不會嘗試刪除堆棧變量:

// outside of main
void noop_deleter(A*){/*do nothing*/}

 // call...
b.b(shared_ptr<A>(&a, noop_deleter));

如果你有一個庫 API 絕對想要一個shared_ptr但你想用一個堆棧變量調用它,那么這實際上是有用的。 不過,API 的設計是另一回事……

std::tr1::shared_ptr 有一個構造函數,允許傳遞給定的原始指針。 因此,如果您有一個指向 A 的指針,您將執行以下操作:

std::shared_ptr (pMyA)

但是在您的情況下,指向 A 的指針指向自動變量,而不是指向動態分配的 memory 資源,該資源可以在使用后刪除。

這樣的事情將是一個更好的用例:

class B
{
  void b (shared_ptr <A> pA) {}
}

int main ()
{
  shared_ptr<A> pA (new A);
  B b;
  b.b (pA);
  ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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