参考 c++ 临时字符串的内容

Referring to the contents of c++ temporary strings

本文关键字:字符串 c++ 参考      更新时间:2023-10-16

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

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

infile.string()返回类型为 std::string 的对象。.c_str()返回指向对象某些内容的指针,因此file是指向对象内容的指针。但是在语句的末尾,std::string对象及其内容被破坏。因此,指针file指向下一个语句开头的无处。

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

此C++机制可避免您指出的悬空引用错误。在上面的代码中,临时存在,直到函数进程文本文件的右大括号。

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