gpt4 book ai didi

c++ - 在到达范围结束后 boost 共享指针 "runtime error"

转载 作者:太空宇宙 更新时间:2023-11-04 16:21:17 24 4
gpt4 key购买 nike

我正在练习 boost,现在我正在测试 boost 共享指针。我有一个可以读取文件的 Util 类。读取文件后,我的“读取”方法返回指向文件内容的 boost::shared_ptr。然后我将这个共享指针传递给我的 Parser 类,该类逐行解析字符串。解析完成后,然后在我的 Parser 类构造函数的末尾(在'}')我得到一个指向 boost 头文件的“运行时错误”。更具体地说,checked_delete.hpp 到“delete x”行:

template<class T> inline void checked_delete(T * x) {
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}

简化后的代码如下所示:

class File {
string _path;
public:
File(string path)
~File()
void Open();
boost::shared_ptr<string> Read();
void Close();
};

class Parse {
public:
Parse(string path) {
File file = File(path);
file.Open();
boost::shared_ptr<string> fileContentPtr = file.Read();
StartParsing(fileContentPtr);
file.Close();
}
~Parse();
StartParsing(boost::shared_ptr<string> fileContentPtr);
};

int main() {
string path = "<some path to my file>";
Parse(path);
}

任何人都可以给我提示,我做错了什么?提前致谢!

编辑:我的 Read() 函数:

boost::shared_ptr<string> File::Read() {
if(file.is_open()) {
ostringstream stream;
stream << file.rdbuf();
string content = stream.str();
boost::shared_ptr<string> contentPtr(&content);
return contentPtr;
}
else {
throw std::runtime_error("File isn't opened");
}
}

其中“file”变量是在 Open() 中使用的 std::fstream 文件

最佳答案

boost::shared_ptr 包含的对象必须动态分配,通过 new 显式地显示或隐含地通过 boost::make_shared<> .来自 boost::shared_ptr :

The shared_ptr class template stores a pointer to a dynamically allocated object, typically with a C++ new-expression. The object pointed to is guaranteed to be deleted when the last shared_ptr pointing to it is destroyed or reset.

在这种情况下,std::string实例已分配堆栈并将在 Read() 时被销毁返回:

string content = stream.str();
boost::shared_ptr<string> contentPtr(&content);

这导致 shared_ptr有悬空指针和尝试至 deleteshared_ptr超出范围,导致错误。

该程序已经具有未定义的行为,因为任何尝试访问的代码shared_ptrRead() 之后正在取消引用悬空指针。

要更正,动态分配 std::string :

return boost::make_shared<std::string>(stream.str());

或者,更简单,只返回并存储一个 std::string实例代替:

return stream.str();

因为编译器应该能够使用 return value optimization .


请注意,c++11 引入了 smart pointers , std::shared_ptr其中。

关于c++ - 在到达范围结束后 boost 共享指针 "runtime error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16523995/

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