【发布时间】:2013-05-07 18:41:09
【问题描述】:
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
谢谢。
【问题讨论】:
-
您的函数
void bool someWork(data_ptr& passed_ptr)应该返回一个bool,但不会返回任何内容。那是未定义的行为。你能发布真实的代码,或者一些足够接近的东西来进行有意义的分析吗? -
还有,
SomeData的定义是什么? -
另一件事:问题可能出在您创建或使用
ABC的方式上。我想你应该准备一个SSCCE -
SomeData 是一个在依赖项目中定义的类 - 包含很多东西,其中一个 std::vector
- 它是一种特殊的树。我不认为它是相关的......这应该适用于任何类型的课程? -
好吧,如果您的
SomeData不遵守三规则,例如,复制构造它可能会导致诸如双重删除之类的麻烦。我还看到您通过原始指针持有子节点,这表明您正在使用new和delete进行一些手动内存管理,这很容易出错
标签: c++ boost shared-ptr reset