首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类结束时出现boost::shared_ptr错误

类结束时出现boost::shared_ptr错误
EN

Stack Overflow用户
提问于 2013-05-08 02:41:10
回答 3查看 639关注 0票数 1
代码语言:javascript
复制
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“类型的错误。

代码语言:javascript
复制
"unknown file: error: SEH exception with code 0xc000005 thrown in the test body."

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

Visual Studio说:

代码语言:javascript
复制
    "First-chance exception at 0x00ceba41 in myFile_gtest.exe: 0xC0000005: 
Access violation reading location 0xfeeefeee."

它在没有它的情况下也会发生(最初我甚至没有放一个reset(),我认为当共享指针超出作用域时,它会杀死自己。

我会有什么问题呢?

boost 1.47

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-08 06:29:52

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

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

在它不存在的情况下,它指向相同的数据,所以当原始指针超出作用域时,缓存的指针就失去了它的指针(即使在调试时,它看起来仍然拥有它……)

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-08 03:53:42

代码语言:javascript
复制
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指针,然后您取消了对它的引用。

除了NULL之外,您不能将cached_ptr设置为任何其他值,但这是另一个问题。

票数 0
EN

Stack Overflow用户

发布于 2013-05-08 03:54:04

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

代码语言:javascript
复制
cached_ptr = get_ptr();
passed_ptr.reset(new SomeData(*cached_ptr));

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16426271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档