返回char *出错,打印好,返回错误(c ++)

时间:2016-02-12 10:21:41

标签: c++ char return stdstring

在这个函数中我需要返回一个char *变量,在我返回它之前,我打印它并打印好。变量发生了什么导致返回变量错误以及为什么?

功能:

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继承自异常)

谢谢!

2 个答案:

答案 0 :(得分:3)

离开函数后,您的字符串uncommenting将被销毁。因此,返回的指针无效,因为它指向由对象处理的内存。如果对象被破坏,它将再次释放这个内存。

使str成为异常的成员并在构造函数中初始化它。 比str将返回有效指针(只要异常对象有效)。

what()

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

答案 1 :(得分:0)

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

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

你应该将strcpy用于新生成的内存块,或者直接返回std::string对象,这将是更安全的选项。