C++ boost::类结束时出现共享\u ptr错误

C++ boost::类结束时出现共享\u ptr错误,c++,boost,shared-ptr,reset,C++,Boost,Shared Ptr,Reset,析构函数上出现错误:cached_ptr.reset() Visual Studio说: "unknown file: error: SEH exception with code 0xc000005 thrown in the test body." 它在没有它的情况下也会发生(最初我甚至没有放置reset(),我认为共享指针在超出范围时会自杀 我有什么问题 增加1.47 谢谢。typedef boost::共享的数据\u ptr; "First-chance exception a

析构函数上出现错误:
cached_ptr.reset()

Visual Studio说:

"unknown file: error: SEH exception with code 0xc000005 thrown in the test body."
它在没有它的情况下也会发生(最初我甚至没有放置reset(),我认为共享指针在超出范围时会自杀

我有什么问题

增加1.47

谢谢。

typedef boost::共享的数据\u ptr;
    "First-chance exception at 0x00ceba41 in myFile_gtest.exe: 0xC0000005: 
Access violation reading location 0xfeeefeee."
data_ptr get_ptr(){data_ptr x;return x;} cached_ptr=get_ptr(); 已通过重置(新的SomeData(*缓存的重置));

get_ptr()
返回了一个
NULL
指针,然后您取消了对它的引用


您从未将
cached_ptr
设置为除
NULL
之外的任何值,但这是一个单独的问题。

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

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));
因此,您的程序变得不正确。在这种情况下,您无法实现任何期望。

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

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

在没有指针的情况下,它指向相同的数据,因此当原始指针超出范围时,缓存的指针丢失了它的点(即使在调试时,它看起来仍然有它的点…)


SomeData
添加副本构造函数解决了问题。

您的函数
void bool someWork(data\u ptr&passed\u ptr)
应该返回一个
bool
,但不返回任何内容。这是未定义的行为。您是否可以发布真实的代码,或者发布一些表示它的内容,以便进行有意义的分析?另外,
SomeData
的定义是什么?另一件事:问题可能在于您创建或使用
ABC
的方式>。我想你应该准备一个SomeData是一个在依赖项目中定义的类-包含很多东西,其中一个std::vector-它是一种特殊的树。我不认为它是相关的…这应该适用于任何类型的类?好吧,如果你的
SomeData
不遵守三的规则,例如,copy const我还看到您通过原始指针保存子节点,这表明您正在使用
new
delete
进行一些手动内存管理,这很容易出错,我想我的评论解释了getptr()做了大量工作,然后返回该工作的结果。它不是空的,并且代码在没有缓存的ptr的情况下也可以工作。Andy Prowl的评论显示我没有副本构造函数-我使用的类没有副本构造函数,我想我可能不需要它。添加副本构造函数解决了问题。@Thalia啊,谢谢为了澄清。我现在明白了。我以为你指的是工作(动词),但实际上你指的是工作(名词)。对不起,我以为我的评论解释了get_ptr()做了很多工作,然后返回该工作的结果(作为“data_ptr”,在该函数中创建)。它不是null,并且代码在没有缓存的ptr的情况下也可以工作。Andy Prowl的评论显示我没有副本构造函数-我使用的类没有副本构造函数,我认为我可能不需要它。添加副本构造函数解决了问题。
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));
cached_ptr = get_ptr();
passed_ptr.reset(new SomeData(*cached_ptr));