C++ 为什么语句中的链接方法不能给出预期的结果?

C++ 为什么语句中的链接方法不能给出预期的结果?,c++,filesystems,method-chaining,static-code-analysis,buildconfiguration,C++,Filesystems,Method Chaining,Static Code Analysis,Buildconfiguration,我可以计算std::filesystem::path变量的const char*表示,如下所示: std::filesystem::path path1(L"ConsoleApplication1.cpp"); std::string strPath1 = path1.string(); const char* charArrPath1 = strPath1.c_str(); 但是如果我省略了字符串变量的显式赋值,并在char数组初始化语句中使用方法链接 const char* charArr

我可以计算
std::filesystem::path
变量的
const char*
表示,如下所示:

std::filesystem::path path1(L"ConsoleApplication1.cpp");
std::string strPath1 = path1.string();
const char* charArrPath1 = strPath1.c_str();
但是如果我省略了
字符串
变量的显式赋值,并在char数组初始化语句中使用方法链接

const char* charArrPath1 = path1.string().c_str();
变量
charArrPath1
在执行后包含垃圾

为什么方法链似乎不起作用

PS如果在初始化
charArrPath1
之后,我将
path1
上的
string()
的结果显式分配给一些不相关的变量,我确实会得到预期的结果:

std::filesystem::path path1(L"ConsoleApplication1.cpp");
const char* charArrPath1 = path1.string().c_str();
std::string strPathUnrelated = path1.string();
std::cout << charArrPath1 << std::endl;
有人对此行为有什么解释吗?

因为它按值返回,返回的是a,在完整表达式后将被销毁,而从
c_str()
获取的指针处于悬空状态

正如您所尝试的,如果使用命名变量,指针不会被挂起,不会立即被销毁。

挂起指针是依赖指针和显式资源释放的语言中最黑暗的噩梦(摘自Bjarne Stroustrup和Herb Sutter的“C++类型和资源安全模型简介”,第3节,内存安全,第4页)

我在追踪我的大型程序的一个看似间歇性的bug时,最终发现它是蛮力的,在断点上迭代。它恰好隐藏在一个很少执行的分支中构造文件系统路径提示的相当模糊的行中。我想知道为什么“代码分析”是一个非常棒的工具,它可以强制执行代码的类型和资源安全性在启动Visual Studio的项目属性中检查“在生成时启用代码分析”时,未能警告我这些行,并向Stack Overflow发布了一个谨慎的问题,希望有人教我使用代码分析

<好奇】,我也开始浏览MSDN文档,了解到微软本地推荐规则规则集,C++项目的默认值,不包含整个C++核心指南集。我选择了微软所有规则规则集,运行它与我的程序的旧版本,并用警告C2686标记了罪犯行,不通过。指向函数的指针可能无效

至于我问题的PS和“Epilegomenon”部分,我发现报告的不同配置的行为仅对v142平台工具集有效,并且(可能)意义不大

#include <iostream>
#include <filesystem>

int main()
{
    std::filesystem::path path1(L"ConsoleApplication1.cpp");
    const char* charArrPath1 = path1.string().c_str();

    std::cout << charArrPath1 << std::endl;
}
ConsoleApplication1.cpp