[英]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_ptr
到std::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.