簡體   English   中英

在課程結束時出現boost :: shared_ptr錯誤

[英]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.

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