簡體   English   中英

增強智能指針和非POD類型(C ++)

[英]Boost Smart Pointers and non-POD types (C++)

在練習智能指針並查看它們如何防止內存泄漏並通過RAII協助進行內存管理時,我正在執行以下操作:

#include <boost/shared_ptr.hpp>
#include <vector>

#include <iostream>

using std::cout;
using boost::shared_ptr;

class myobj {
    public:
    shared_ptr<int> a;
    myobj() {
        shared_ptr<int> b(new int[50]);
        a = b;
    }
    ~myobj() {}
};

typedef boost::shared_ptr<myobj> myobj_ptr;

int main() {
    for (unsigned int i=0; i < 5000000; i++) {
        myobj *foo = new myobj();
        myobj *bar = new myobj();
        myobj_ptr bar_ptr(bar);

        bar_ptr = myobj_ptr(foo);
        bar = foo;
    }
    return 0;
}

有什么辦法可以做到這一點(希望我的目標出現在“偽”代碼中):

a = new int[50];

我可以從Boost shared_ptr.hpp文件本身看到為什么這將不起作用,但是我不明白為什么這將不起作用:

shared_ptr<int> a;
int *b;
myobj() {
    b = new int[50];
    boost::detail::sp_enable_shared_from_this( a, b, b );
}

它返回此錯誤:

warning: cannot pass objects of non-POD type ‘class boost::shared_ptr<int>’ through ‘...’; call will abort at runtime

我不完全了解。

首先, boost::detail都是實現細節。 除非您正在開發將成為boost本身一部分的代碼,否則請不要觸摸它。

其次, boost::shared_ptr不能直接包裝數組。 這是因為C ++中的數組必須使用delete [] ,而boost::shared_ptr使用delete 請使用boost::shared_array ,或者使用boost::shared_ptrstd::vector 如果確實必須將shared_ptr與數組一起使用,則必須使用自定義刪除器創建它:

template <typename T>
struct array_deleter {
  void operator()(T *p) {
    delete [] p;
  }
};

// later...
boost::shared_ptr<int> p(new int[50], array_deleter<int>());

但是,請實際上不要這樣做。 使用shared_array<int>shared_ptr<vector<int> >

至於為什么不能這樣做:

boost::shared_ptr<int> a;
// later
a = new int;

這是因為過分容易地將某個內容創建為shared_ptr是危險的-請記住,如果您將某個內容兩次創建為shared_ptr,則最終將其雙重釋放。 因此,shared_ptrs將僅通過其構造函數獲取原始指針。 如果您真的想使用原始指針覆蓋shared_ptr,則可以采用以下一種方法:

a.swap(boost::shared_ptr<int>(new int));

這將創建一個新的指針,然后用它交換a 臨時智能指針(帶a則的舊值)被釋放。

除非您還提供執行delete[]而不是delete的自定義刪除器,否則您不能將使用new int[50]分配的內容分配給shared_ptr<int>

enable_shared_from_this旨在增加類類型檢索擁有的共享指針的能力,您剛剛從detail名稱空間中提取了一些東西。 不能直接使用它。 它旨在像這樣使用。

class myobj : public boost::enable_shared_from_this<myobj>
{ //...

數組的最簡單管理容器是std::vector<int> ,而不是shared_ptr

對於初學者來說,您要調用的函數位於detail名稱空間中,這意味着可能不打算直接調用該函數。 那可能與您的問題有關。

至於您遇到的特定錯誤,該錯誤通常意味着您試圖調用傳遞非POD參數的varargs函數。 在這種情況下,這是因為boost::shared_ptr<int>不是POD類型。 我認為這與使用數組和原始指針無關。 我認為您只是在使用錯誤的參數調用錯誤的函數。 您是要使用boost::shared_from_this嗎?

暫無
暫無

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

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