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
所以我在按钮点击方法中有简单的代码:
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