gpt4 book ai didi

c++ - boost::shared_ptr 类结束时出错

转载 作者:太空宇宙 更新时间:2023-11-04 14:06:59 25 4
gpt4 key购买 nike

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 test 单元测试 - 当我添加 cached_ptr 时,google test 一直给我“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(),我认为共享指针在超出范围时会自行终止。

我的问题是什么?

boost 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 以外的任何值,但这是一个单独的问题。

关于c++ - boost::shared_ptr 类结束时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16426271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com