C++ 返回的常量字符*未打印好的字符串(cpp)

C++ 返回的常量字符*未打印好的字符串(cpp),c++,string,C++,String,我有下一个代码: const char* NameErrorException::what() const throw() { std::string to_return = "NameError : name '" + _name + "' is not defined"; return to_return.c_str(); } 它应该返回一个well“const char*”类型的字符串。 在印刷过程中,我喜欢这样: 捕获(NameErrorException myExce

我有下一个代码:

const char* NameErrorException::what() const throw()
{
    std::string to_return = "NameError : name '" + _name + "' is not defined";
    return to_return.c_str();
}
它应该返回一个well“const char*”类型的字符串。 在印刷过程中,我喜欢这样: 捕获(NameErrorException myExcep) {
std::cout
to_return
具有自动存储持续时间

当函数返回时,它超出范围,因此
c_str()
返回的指针无效


通常,您只需返回一个
std::string
,并信任返回值优化以避免深度复制。但如果您必须返回一个
const char*
,请确保支持的
std::string
实例仍在范围内。也许可以将其作为异常类的成员变量?

以返回de>具有自动存储持续时间

当函数返回时,它超出范围,因此
c_str()
返回的指针无效


通常,您只需返回一个
std::string
,并信任返回值优化以避免深度复制。但如果您必须返回一个
const char*
,那么请确保支持的
std::string
实例仍在范围内。也许可以将其作为异常类的成员变量?

您正在返回p指向局部变量的内容。这很糟糕

函数一结束,所有局部变量都将被销毁。您不能返回任何引用它们的数据


返回
std::string

返回指向局部变量内容的指针。这很糟糕

函数一结束,所有局部变量都将被销毁。您不能返回任何引用它们的数据


返回
std::string

这与C有什么关系?您应该删除
C
标记。因为您返回一个指向在函数结束后不再存在的内存的指针。函数中的字符串对象在超出范围时将被销毁,它将不再存在,并且在字符串数据为。识别的重复项是对问题的充分描述,但它无助于为OP提供可能的解决方案。问题写得很好,包含代码和输出文档,因此IMHO值得回答。C有什么问题?您应该删除
C
标记。因为您返回的内存指针不再是函数结束后存在。函数中的字符串对象在超出范围时将被销毁,它将不再存在,字符串数据所在的内存也将不存在。标识的重复项是对问题的充分描述,但它没有为OP提供可能的修复。问题很好手写,包含代码和输出文档,所以IMHO值得回答。虽然您正确地确定了原因,但您的解决方案将偏离为异常描述返回常量字符*的惯例。是的,您是对的,我关注的是主要问题。虽然您正确地确定了原因,但您的解决方案将这与为异常描述返回const char*的惯例不同。是的,你是对的,我关注的是主要问题。
const char* NameErrorException::what() const throw()
{
    std::string to_return = "NameError : name '" + _name + "' is not defined";
    std::cout << to_return.c_str();
    return to_return.c_str();
}