繁体   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