gpt4 book ai didi

C++ MFC 缺少 const char* 变量

转载 作者:行者123 更新时间:2023-11-30 01:09:47 24 4
gpt4 key购买 nike

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

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”(至少它没有显示在调试器中)。任何线索为什么它在直接通过时有效而在其他情况下失败?此外,当我将“名称”转换为 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 )

关于C++ MFC 缺少 const char* 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com