boost::filesystem::path::string()输出的奇怪行为
strange behaviors for boost::filesystem::path::string() output
对于pf.string()
输出,似乎有一些奇怪的行为,其中pf
是用p.filename()
生成的,而p
的类型是boost::filesystem::path
,并用char const*或std::string构造。
这是代码段:
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main(int argc, char **argv) {
fs::path p(argv[0]); // or fs::path p((std::string(argv[0])));
fs::path &&pf = p.filename(); // or fs::path pf = p.filename();
std::string const &name = p.filename().string();
std::cout << "*" << name << "*n";
std::string const &p_name = pf.string();
std::cout << "*" << p_name << "*t";
std::cout << "*" << name << "*n";
std::string s_name = p.filename().string();
std::cout << "*" << s_name << "*t";
std::cout << "*" << name << "*n";
return 0;
}
这里的argv[0]
是fs.out
,可执行文件(用clang3.4
/gcc4.9
和-O3
/-O0
编译)的输出是:
**
*fs.out* **
*fs.out* *fs.out*
我使用的增强版本是1.55,来自Debian jessie(测试)包。
我的问题:
- 为什么
name
在前2行中为空 - 为什么2号线
p_name
不为空,name
为空 - 为什么这个程序在第3行有正确的(?)输出,尽管
s_name
和name
之间似乎没有关系
您正在引用临时文件。
如果绑定到const
引用(如p_name
),则临时的生存期将延长到包含范围的末尾。
否则,您只是在调用未定义的行为。这也解释了当分配给一个完全不同的变量时,name
是如何变化的。这显然是因为s_name
恰好分配了name
仍然(错误地!)所指的相同内存块。可能会发生更糟糕的事情。
您应该按值获取filename()
(和友元)的返回值(如果类型支持,则在现代编译器上应自动执行移动)。
请注意MSVC"似乎"接受了此代码并"做了你所期望的"——可能是因为它有一个非标准扩展,即使绑定到非常量引用,也可以延长临时变量的生存期。
不错。;-)
name
是参考。也就是说,它只是引用到p.filename().string()
。然而,这是一个临时,即它在语句完成后被销毁,留下name
来引用无效内存。你在一个行为不明确的国家,幸运的是你的程序没有崩溃。
(他在const &
上向我更新了关于你第二个问题的细节,所以给他+1。)
在第三轮中,s_name
是对象,即它持有p.filename().string()
的副本(因此是有效的)。幸运的是,编译器显然在name
所指的相同位置创建了该对象…
不用说,你永远不应该依赖这种行为。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么该输出是 boost 程序 (boost::filesystem) 中的"Bus error: 10"?
- boost::filesystem::path::string()输出的奇怪行为