C++ 参考c+的内容+;临时字符串
下面的代码正在工作,我正在努力理解如何工作C++ 参考c+的内容+;临时字符串,c++,c++11,boost,temporaries,C++,C++11,Boost,Temporaries,下面的代码正在工作,我正在努力理解如何工作 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"); . . //U
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.
}
据我所知,infle.string()
创建一个临时文件并指向内容。当语句结束(;)时,临时字符串应该超出范围,导致文件成为悬空指针
我将使用string而不是char*
,但仍然需要理解我缺少了什么
编译器-gcc 4.8.4优化-O3C++指定将临时对象绑定到堆栈上对常量的引用会将临时对象的生存期延长到引用本身的生存期,这意味着位于堆栈中的const char*file
这个C++机制避免了你所指出的悬空参考错误。 在上面的代码中,临时变量一直存在到Function processTextFile的右大括号结束
您可以查看此项以了解更多信息。C++指定将临时对象绑定到堆栈上对常量的引用会将临时对象的生存期延长到引用本身的生存期,这意味着位于堆栈中的const char*file
这个C++机制避免了你所指出的悬空参考错误。 在上面的代码中,临时变量一直存在到Function processTextFile的右大括号结束
您可以查看此项以了解更多信息。
infle.string()
返回类型为std::string
的对象。而.c_str()
返回指向对象某些内容的指针,因此file
是指向对象内容的指针。但是在语句的末尾,std::string
对象及其内容被破坏。因此,指针文件在下一条语句的开头不指向任何地方 infle.string()
返回类型为std::string
的对象。而.c_str()
返回指向对象某些内容的指针,因此file
是指向对象内容的指针。但是在语句的末尾,std::string
对象及其内容被破坏。因此,指针文件在下一条语句的开头不指向任何地方 代码中没有常量引用,也没有生存期扩展。指针晃来晃去。@Quentin:错了。指针没有悬空,我只是在上面的代码上运行memcheck,没有检测到内存错误。没有声明要执行生存期扩展的引用!这看起来像std::string&&file=infle.string()代码>代码中没有常量引用,也没有生存期扩展。指针晃来晃去。@Quentin:错了。指针没有悬空,我只是在上面的代码上运行memcheck,没有检测到内存错误。没有声明要执行生存期扩展的引用!这看起来像std::string&&file=infle.string()
如果在调用c_str()
的行之后和使用const char*文件之前没有创建其他局部变量,您可能会很幸运。该临时字符串的内容可能仍存在于内存中,但您对此没有任何保证。结论:这是未定义的行为,不要这样做。@zett42。更新了我的问题。文件之后创建了一些局部变量。这段代码已经使用了很长时间,而且还没有失败。如果我每次运气好的时候都有一分钱,到现在我已经是世界上最富有的人了只是想确保我的理解没有差距。如果在调用c_str()
的行之后和使用const char*file
之前没有创建其他局部变量,您可能会很幸运。该临时字符串的内容可能仍存在于内存中,但您对此没有任何保证。结论:这是未定义的行为,不要这样做。@zett42。更新了我的问题。文件之后创建了一些局部变量。这段代码已经使用了很长时间,而且还没有失败。如果我每次运气好的时候都有一分钱,到现在我已经是世界上最富有的人了只是想确保我的理解没有差距。