[英]boost::shared_ptr error at end of class
class SomeData{};
typedef boost::shared_ptr<SomeData> data_ptr;
class ABC {
public: ABC(){}
~ABC(){cached_ptr.reset(); }
data_ptr get_ptr() {data_ptr x; return x;} // it does work and returns a data_ptr
bool someWork(data_ptr& passed_ptr) {
if(cached_ptr == NULL) {
cached_ptr = get_ptr();
passed_ptr.reset(new SomeData(*cached_ptr));
}
return true;
}
data_ptr otherWork() {
if(cached_ptr == NULL) {
cached_ptr = get_ptr();
data_ptr local_ptr = boost::make_shared<SomeData>(*cached_ptr);
}
return data_ptr; // after some more work
}
private: data_ptr cached_ptr; // class member
};
上面是我嘗試使用的一些代碼的簡化。
直到我添加了“ cached_ptr”之后,它才能夠在連續調用之間緩存數據,從而避免每次都調用get_ptr()(這可能會很大)。
注意:我具有boost :: make_shared和reset()-我對兩者進行了實驗,以查看錯誤是否是由副本引起的。 並沒有改變(如預期)。
我已經安裝了Google測試單元測試-當我添加了cached_ptr時,Google測試就給了我“ GTEST_HAS_SEH”類型的錯誤。
"unknown file: error: SEH exception with code 0xc000005 thrown in the test body."
錯誤發生在析構函數上: cached_ptr.reset()
;
Visual Studio說:
"First-chance exception at 0x00ceba41 in myFile_gtest.exe: 0xC0000005:
Access violation reading location 0xfeeefeee."
它也會在沒有它的情況下發生(最初我什至沒有放置reset(),我以為共享指針在超出范圍時會自行殺死。
我可能是什么問題?
提升1.47
謝謝。
typedef boost::shared_ptr<SomeData> data_ptr;
data_ptr get_ptr() { data_ptr x; return x; }
cached_ptr = get_ptr();
passed_ptr.reset(new SomeData(*cached_ptr));
get_ptr()
返回NULL
指針,然后取消引用它。
您永遠不會將cached_ptr
設置為NULL
以外的任何NULL
,但這是一個單獨的問題。
您在以下片段中取消引用空指針(* cached_ptr):
cached_ptr = get_ptr();
passed_ptr.reset(new SomeData(*cached_ptr));
因此您的程序格式不正確。 在這種情況下,您將無法做任何期望。
正如安迪·普羅(Andy Prowl)注意到的(在對我的問題的評論中),指針所指向的類未包含復制構造函數。
boost :: make_shared需要復制構造函數才能進行復制...
在沒有它的情況下,它指向相同的數據,因此當原始指針超出范圍時,緩存的指針失去了意義(即使在調試時,看起來仍然擁有它……)
為SomeData
添加副本構造SomeData
解決了該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.