[英]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.