boost::shared_ptr 课结束时出错

boost::shared_ptr error at end of class

本文关键字:结束 出错 ptr shared boost      更新时间:2023-10-16
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(( - 我尝试了两者,看看错误是否是由副本引起的。它没有产生任何影响(正如预期的那样(。

我已经有了谷歌测试单元测试 - 当我添加cached_ptr时,谷歌测试一直给我"GTEST_HAS_SEH"类型的错误。

"unknown file: error: SEH exception with code 0xc000005 thrown in the test body."

析构函数上发生错误:cached_ptr.reset() ;

视觉工作室 说:

    "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以外的任何内容,但这是一个单独的问题。

在以下片段中取消引用空指针 (*cached_ptr(:

cached_ptr = get_ptr();
passed_ptr.reset(new SomeData(*cached_ptr));

因此,您的程序将变得格式不正确。在这种情况下,您无法执行任何期望。

正如 Andy Prowl 注意到的那样(在我的问题的评论中(,指针指向的类不包含复制构造函数。

boost::make_shared 需要一个复制构造函数才能制作副本...

在没有它的情况下,它

指向相同的数据,因此当原始指针超出范围时,缓存的指针会丢失其点(尽管在调试时,它看起来仍然有它......

SomeData 添加复制构造函数解决了这个问题。