1

以下代码正在工作,我试图了解如何。

int Process::processTextFile(const boost::filesystem::path& infile)
{
    const char *file = infile.string().c_str();
    uint16_t num_lines = 0;
    .
    .
    .
    FILE *fp;
    fp = fopen(file, "r");
    .
    .
    //Use fp for reading and stuff.
}

据我了解infile.string(),创建一个临时文件指向内容。在语句结束 (;) 的那一刻,临时字符串应该超出范围,导致文件成为悬空指针。

我将使用字符串而不是,char*但仍然需要了解我缺少什么。

编译器 - gcc 4.8.4
优化 - O3

4

2 回答 2

2

infile.string()返回一个类型的对象std::string。并.c_str()返回指向对象某些内容的指针,指向对象file内容的指针也是如此。但在语句结束时,std::string对象及其内容被破坏。结果,指针file在下一条语句的开始处不指向任何地方。

于 2017-06-16T13:41:56.637 回答
-2

C++ 指定将临时对象绑定到堆栈上对 const 的引用会将临时对象的生命周期延长到引用本身的生命周期,这意味着const char *file位于堆栈中。

这种 C++ 机制避免了您指出的悬空引用错误。在上面的代码中,临时的存在直到你的函数 processTextFile 的右花括号。

您可以查看此GOTW以获取更多信息。

于 2017-06-16T12:56:08.600 回答