c++ - 在自定义 C++ 异常类中消失的字符串

标签 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_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/

相关文章:

c++ - 保存文件或文件夹的时间戳?

c++ - 非均匀采样的CUDA重采样

ruby-on-rails - 获取 Ruby 变量引用的对象

c++ - 使用字符指针拆分单词中的句子

c++ - 从 DLL 返回 std::wstring 是否安全?

c++ - wcout与cout、wstring与string的混淆

regex - 从postgresql中的字符串转换方程

Python:字符串中的异或十六进制值

python - 如何定义一个方法以便返回当前类的实例而不是它在 Python 中继承的类的实例?

c++ - C++中的内存管理问题