我试图从这样的函数返回一个字符串:
virtual const char* what() const throw()
{
std::string str = "Name Error: name ";
str+= n_name;
str += " is not defined";
char ret[256]="";
const char* temp = str.c_str();
strcpy(ret, temp);
return ret;
}
但是当我尝试在另一个地方打印时:
const char* str= exc.what();
std::cout << str;
输出是垃圾。
我认为问题是char []并且它应该是char *,但是当我将其更改为
时char* ret="";
程序在
崩溃strcpy(ret, temp);
有人可以帮帮我吗? 附:该函数必须返回一个const char *
答案 0 :(得分:0)
当what()
返回并且返回值存储到str
时,数组ret
将因为它的范围而被销毁,并且这个指针从{返回} {1}}是一个悬空指针,在derefencing时会导致未定义的bevahiour。您应该what()
数组(以及使用它后new
)或只返回delete
。
答案 1 :(得分:0)
主要问题来自返回指向局部变量的指针。如果您使用-Wall
编译器选项(我鼓励您在您使用的每个编译中使用),您将获得:
警告:本地变量的地址&#39; ret&#39;返回[-Wreturn-local-addr]
确实,char ret[256]="";
是本地功能。在功能结束时,局部变量不再存在。因此,当执行std::cout << str;
时,指向的记忆不再存在。
使用char* ret="";
时,您不会分配内存。你只需要一个指向包含""
的只读静态存储器的指针。并且始终使用-Wall
选项,您将收到一条警告,指出您做错了什么:
警告:ISO C ++禁止将字符串常量转换为&#39; char *&#39; [-Wwrite串]
你必须分配内存:
char * ret = new char[str.size()+1];
但请注意,每个new
必须有一个delete
=&gt;应手动释放每个手动分配的内存
答案 2 :(得分:0)
看起来你正在尝试实现异常。你为什么不继承std::runtime_error
已经提供机制来完成这项工作?您只需将所需的消息传递给其构造函数。