返回 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;
}
}
string::c_str()
returns 指向所用内部存储器的指针。
你的 string
对象是一个局部变量,它在你的函数调用结束时被销毁,导致之后的内存访问无效。
您应该使用 strcpy
新生成的内存块或直接 return 一个 std::string
对象,这将是更安全的选择。
在这个函数中我需要 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;
}
}
string::c_str()
returns 指向所用内部存储器的指针。
你的 string
对象是一个局部变量,它在你的函数调用结束时被销毁,导致之后的内存访问无效。
您应该使用 strcpy
新生成的内存块或直接 return 一个 std::string
对象,这将是更安全的选择。