我编写了一个自定义异常类来处理 OLE 自动化错误。 what() 方法如下所示:
const char* OleException::what() const throw() {
std::string res = std::runtime_error::what();
LPTSTR errorText = NULL;
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText,
0,
NULL);
if(NULL != errorText) {
res = res + " - " + errorText;
LocalFree(errorText);
}
//std::cout << res << std::endl;
return res.c_str();
}
但是,当我尝试打印它在我的 main() 函数中返回的字符串时,我得到的只是字母“I”。奇怪的是:当我取消注释该方法的倒数第二行时,它工作正常,即我在终端上两次收到相同的消息。我做错了什么?
最佳答案
您的问题是超出范围的对象的自动销毁。
您的 std::string res 是 what() 方法的局部变量,并且您返回指向其内部结构的指针。当您退出该函数时,本地对象被破坏,您正试图使用现在的悬空指针。
当您从 what() 方法内部显示它时,没有问题,因为您是在字符串被破坏之前显示它。
您的问题的一个好的解决方案是使 std::string res 成为异常类的数据成员。然后只要你的异常实例没有被销毁,你就可以安全地访问字符串内容。
关于c++ - 在自定义 C++ 异常类中消失的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225687/