返回 char* 出错,打印好的,return 打印的很差 (c++)

Returning char* goes wrong, print it good, return it badly (c++)

在这个函数中我需要 return 一个 char* 变量,在我 return 它之前,我打印它并且它打印得很好。导致 return 变量错误的变量发生了什么?为什么?

函数:

const char* NameErrorException::what() const throw()
{
     std::string str = "NameErrorException: name \'";
     str += _name;
     str += "\' is not defimed";
     std::cout << str.c_str()<< std::endl; //Prints good
     return str.c_str(); 
}

打印代码:

catch (std::exception& ex)
{
   //Prints something like "▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌♀·┘v♦"
    std::cout << ex.what() << std::endl;
}

(NameErrorException 异常的继承者)

谢谢!

您的字符串 str 将在您离开该函数后销毁。所以你 return 的指针是无效的,因为它指向由对象处理的内存。如果对象被销毁,它将再次释放此内存。

使str成为Exception的成员并在构造函数中对其进行初始化。 比你的 what() 将 return 一个有效的指针(只要异常对象有效)。

#include <string>
#include <iostream>

class NameErrorException : public std::exception
{
    std::string m_what;
public:
    NameErrorException(std::string name)
        :m_what("NameErrorException: name \'" + name + "\' is not defined")
    {
    }

    const char* what() const throw() override
    {
        return m_what.c_str();
    }
};


int main() 
{
    try
    {
        throw NameErrorException("TEST");
    }
    catch (std::exception& ex)
    {
        std::cout << ex.what() << std::endl;
    }
}

看这里:http://coliru.stacked-crooked.com/a/878d5835db998300

string::c_str() returns 指向所用内部存储器的指针。

你的 string 对象是一个局部变量,它在你的函数调用结束时被销毁,导致之后的内存访问无效。

您应该使用 strcpy 新生成的内存块或直接 return 一个 std::string 对象,这将是更安全的选择。