临时std::返回垃圾的字符串 我还在学习C++,所以请你容忍我。我正在围绕boost文件系统路径编写一个简单的包装器——我在返回临时字符串方面遇到了一些奇怪的问题。下面是我的简单类(虽然不精确,但非常接近):

临时std::返回垃圾的字符串 我还在学习C++,所以请你容忍我。我正在围绕boost文件系统路径编写一个简单的包装器——我在返回临时字符串方面遇到了一些奇怪的问题。下面是我的简单类(虽然不精确,但非常接近):,c++,C++,使用下面的小测试代码: FileReference file("c:\\test.txt"); OutputDebugString(file.path().c_str()); // returns correctly c:\test.txt OutputDebugString(file.c_str()); // returns junk (ie îþîþîþîþîþîþîþîþîþîþî.....) 我很确定这必须处理临时性,但我不明白为什么会这样——难道所有的东西都不能正确复

使用下面的小测试代码:

FileReference file("c:\\test.txt");

OutputDebugString(file.path().c_str()); // returns correctly c:\test.txt
OutputDebugString(file.c_str());        // returns junk (ie îþîþîþîþîþîþîþîþîþîþî.....)

我很确定这必须处理临时性,但我不明白为什么会这样——难道所有的东西都不能正确复制吗?

看起来像
mPath.string()
按值返回字符串。一旦FileReference::c_str()返回,该临时字符串对象就会被销毁,因此其c_str()将无效。使用这种模型,如果不为字符串引入某种类或静态级别变量,就不可能创建
c_str()
函数

考虑以下备选方案:

//Returns a string by value (not a pointer!)
//Don't call it c_str() - that'd be misleading
String str() const
{             
     return mPath.string();
} 

mPath.string()
返回
std::string
的副本。该副本存储在一个临时文件中,该文件将在此表达式末尾被销毁

.c_str()
返回一个指向内存的指针,当字符串被销毁时,该内存将被销毁,即在该表达式的末尾

您正在返回一个指向已销毁内存的指针。

表达式

OutputDebugString(file.path().c_str())

它们的相似之处在于,它们都有效地对临时
std::string
对象调用
c_str()
方法,并尝试使用该调用的结果。第一个直接调用它作为
file.path().c_str()
subexpression。第二个方法做得更含蓄:在
FileReference::c_str()
方法内部

在第一种情况下,临时
std::string
对象由
file.path()
调用显式创建,作为整个表达式的直接部分。根据该语言的规则,临时对象的生存期将延伸到整个表达式的末尾,这就是为什么临时对象和
c_str()
调用的结果始终有效的原因


在第二种情况下,在
FileReference::c_str()
方法中创建临时
std::string
对象。当该方法返回时,该临时对象将被销毁,这意味着
FileReference::c_str()
返回指向“死”数据的指针。这就是问题中“垃圾”的原因。

OutputDebugString()的源代码是什么?
typedef
,你自己的
CString
。@OttoAllmendinger-这是一个函数。相关:第一个建议的有效用法是
OutputDebugString(file.str().c(u str())@PermanentGuest-你确定吗?我在Boost.Filesystem中找不到
.c_str()
。@Robᵩ : 那些文件都快三年了。请您提一下。;-](这可能是在文件系统v3中添加的。)@PermanentGuest我得到了一个bug路径。c_str()。我只得到了一个角色(从boost 1_49开始)
void str(String &s) const
{             
     s = mPath.string();
} 
CString c_str() const {
        return mPath.string().c_str();
    };
OutputDebugString(file.path().c_str())
OutputDebugString(file.c_str())