C++ 自定义c+中的消失字符串+;例外类
我已经编写了一个自定义异常类来处理OLE自动化错误。what()方法如下所示:C++ 自定义c+中的消失字符串+;例外类,c++,string,class,exception,C++,String,Class,Exception,我已经编写了一个自定义异常类来处理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_ALL
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();
}
const char*OleException::what()const throw(){
std::string res=std::runtime_error::what();
LPTSTR errorText=NULL;
格式化消息(
格式化来自\u系统的\u消息\u
|格式化\u消息\u分配\u缓冲区
|格式化\u消息\u忽略\u插入,
无效的
hresult,
MAKELANGID(LANG_中立,SUBLANG_默认),
(LPTSTR)和错误文本,
0,
无效);
如果(NULL!=错误文本){
res=res+“-”+错误文本;
LocalFree(errorText);
}
//std::cout这是一个非常常见的错误:您返回一个指向本地对象创建的数据的指针,该数据在离开函数时被销毁。这是一个非常常见的错误:您返回一个指向本地对象创建的数据的指针,该数据在离开函数时被销毁。您的问题是自动销毁超出范围的对象
std::string res是what()方法的本地对象,您返回一个指向其内部的指针。当您退出该函数时,本地对象将被销毁,您将尝试使用现在悬空的指针
当您从what()方法内部显示它时,没有问题,因为您是在解构字符串之前显示它的
解决问题的一个好办法是将std::string res设置为异常类的数据成员。然后,只要您的异常实例没有被销毁,您就可以安全地访问字符串内容。您的问题是自动销毁超出范围的对象。
std::string res是what()方法的本地对象,您返回一个指向其内部的指针。当您退出该函数时,本地对象将被销毁,您将尝试使用现在悬空的指针
当您从what()方法内部显示它时,没有问题,因为您是在解构字符串之前显示它的
解决问题的一个好办法是将std::string res设置为异常类的数据成员。然后,只要您的异常实例没有被破坏,您就可以安全地访问字符串内容。正如其他人指出的那样,c_str
返回的指针在what
retu一瞬间失效rns,因为ret
不再处于活动状态
解决方案是将错误消息作为类型为std::string
的异常类的成员,并在构造时进行格式化,而不是在what
中进行格式化。然后,您可以从c\u str
安全返回
class OleException : std::runtime_error // just guessing here
{
std::string msg;
public:
OleException()
{
// construct msg
}
const char* OleException::what() const throw() { return msg.c_str(); }
// etc.
};
正如其他人指出的那样,c_str
返回的指针在what
返回时失效,因为ret
不再有效
解决方案是将错误消息作为类型为std::string
的异常类的成员,并在构造时进行格式化,而不是在what
中进行格式化。然后,您可以从c\u str
安全返回
class OleException : std::runtime_error // just guessing here
{
std::string msg;
public:
OleException()
{
// construct msg
}
const char* OleException::what() const throw() { return msg.c_str(); }
// etc.
};