C++ 自定义c+中的消失字符串+;例外类

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

我已经编写了一个自定义异常类来处理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();
}
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.
};