C++ MFC 缺少 const char* 变量

C++ MFC missing const char* variable

所以我在按钮点击方法中有简单的代码:

std::stringstream ss;
unsigned counter = 0;
while(true)
{
    ss.clear();
    ss << DEFAULT_USER_CONFIG_NAME << " " << ++counter;
    const char* name = ss.str().c_str();
    MessageBox(name);

    /* ... while break condition */
}

问题是消息框是空的。但是当我直接传递文本时它可以正常工作:

MessageBox(ss.str().c_str()); // that shows text just fine

我在调试器中发现没有创建局部变量 "name"(至少它没有在调试器中显示)。任何线索为什么它在直接通过时有效而在其他情况下失败?此外,当我将 "name" 转换为 CString 时,它在 IsEmpty() 检查时返回 true。

表达式 ss.str() 创建一个 临时 std::string 对象。存储 c_str() 的结果因此指向一个临时内存,它很快变成一个悬空指针。一旦完整表达式语句

const char* name = ss.str().c_str();
//                                 ^ this is where the temporary ss.str() gets destroyed.

被评估,临时被销毁。

您已经知道如何解决这个问题,方法是将创建临时对象的表达式放在使用它的完整表达式中。这将临时对象的生命周期延长到完整表达式的末尾:

MessageBox(ss.str().c_str());
//                          ^ this is where the temporary ss.str() gets destroyed.

以下说明了事件的顺序。让我们定义一些占位符 类 和函数:

void messagebox(const char*) {
    cout << "messagebox()" << endl;
}

struct tmp {
    tmp(const char* content) : content(content) { cout << "tmp c'tor" << endl; }
    ~tmp() { cout << "tmp d'tor" << endl; }
    const char* c_str() { return content.c_str(); }
private:
    string content;
};

struct ss {
    tmp str() { return tmp("test"); }
};

有了这个,你的第一个版本

ss s;
const char* name = s.str().c_str();
messagebox(name);

产生以下输出:

tmp c'tor
tmp d'tor
messagebox()

而第二个版本

ss s;
messagebox(s.str().c_str());

更改输出中的顺序:

tmp c'tor
messagebox()
tmp d'tor

(Live sample code)