c++ - boost::shared_ptr 类结束时出错

标签 c++ boost shared-ptr reset

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 test 单元测试 - 当我添加 cached_ptr 时,google test 一直给我“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(),我认为共享指针在超出范围时会自行终止。

我的问题是什么?

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

关于c++ - boost::shared_ptr 类结束时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16426271/

相关文章:

C++如何同时计算和写入

C++ - 如何创建具有 4 个变量和 4 个键的多重映射

c++ - std::shared_ptr 的 vector 未释放内存

c++ - 使用 new 运算符定义 std::shared_ptr 时出错

c++ - make_shared 不能和 enable_shared_from_this 一起玩?

c++ - 运行 Windows 程序并检测它何时以 C++ 结束

c++ - 如何使用带工具栏的 QTextEdit 实现编辑器

c++ - 对 boost::timer::auto_cpu_timer 的 undefined reference

c++ - 你如何从 spirit 解析器输出原始的未解析代码(作为注释)

c++ - Eclipse 不解析 gcc 输出