1
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

谢谢你。

4

3 回答 3

0
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,但这是一个单独的问题。

于 2013-05-07T19:53:42.300 回答
0

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

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

所以你的程序变得不正确。在这种情况下,你不能做任何期望。

于 2013-05-07T19:54:03.557 回答
0

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

boost::make_shared 需要一个复制构造函数才能进行复制...

在没有它的情况下它指向相同的数据,所以当原始指针超出范围时,缓存的指针失去了它的指向(尽管在调试时,它看起来仍然有它......)

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

于 2013-05-07T22:29:51.580 回答