C++ 返回字符串但得到垃圾
我试图从如下函数返回字符串:C++ 返回字符串但得到垃圾,c++,string,char,return,strcpy,C++,String,Char,Return,Strcpy,我试图从如下函数返回字符串: 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; }
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;
该程序在某个时间崩溃
strcpy(ret, temp);
有人能帮我吗?
另外,函数必须在
what()
返回时返回一个const char*,返回值存储在
str
中。数组ret
将因其作用域而被销毁,从what()
返回的指针是一个悬空指针,在解除防护时会导致未定义的溢出。您应该new
数组(并且在使用它之后删除它),或者在what()
返回,返回值存储在str
数组ret
中,由于它的作用域,该数组将被销毁,从what()
返回的指针是一个悬空指针,在解除隔离时会导致未定义的bevahiour。您应该new
数组(并且在使用它之后删除它),或者只返回std::string
主要问题来自返回指向局部变量的指针。如果您使用-Wall
编译器选项(我鼓励您在每次编译时使用该选项),您将获得:
警告:返回的局部变量“ret”的地址[-Wreturn local addr]
实际上,charret[256]=”代码>是本地函数。在函数的末尾,局部变量不再存在。所以,当std::cout时,每个手动分配的内存都应该手动释放,主要问题来自于返回指向局部变量的指针。如果您使用-Wall
编译器选项(我鼓励您在每次编译时使用该选项),您将获得:
警告:返回的局部变量“ret”的地址[-Wreturn local addr]
实际上,charret[256]=”代码>是本地函数。在函数的末尾,局部变量不再存在。因此,当std::cout每个手动分配的内存都应该手动解除分配时,看起来您正在尝试实现一个异常。为什么您不直接从std::runtime\u error
继承,它已经提供了实现这一功能的机制?您只需要将所需的消息传递给它的构造函数
请参见您似乎正在尝试实现异常。为什么您不直接从std::runtime\u error
继承,它已经提供了实现这一功能的机制?您只需要将所需的消息传递给它的构造函数
请参见返回指向无效内存的指针。您需要分配一些内存,指针将指向这些内存。请参阅“malloc”或“new[]”。返回指向无效内存的指针。您需要分配一些内存,指针将指向这些内存。请参阅“malloc”或“new[]”。您确定char ret[256]=“分配内存吗?它与指向只读静态内存的char*ret=“”有何不同?char-ret[256]=“
自动在堆栈上为256char
分配内存,并将其初始化为”
。取消分配在功能结束时自动完成。非常感谢!现在可以了!您确定char-ret[256]=“分配内存吗?”?它与指向只读静态内存的char*ret=“”有何不同?char-ret[256]=“
自动在堆栈上为256char
分配内存,并将其初始化为”
。取消分配在功能结束时自动完成。非常感谢!现在可以了!这就是任务的一部分——创建异常。不管怎样,谢谢。如果你问你真正的问题,你可能会得到更好的答案。但我认为您可能会发现这很有用:这是任务的一部分——创建异常。不管怎样,谢谢。如果你问你真正的问题,你可能会得到更好的答案。但我想你可能会发现这很有用:谢谢,我找到了一个方法!谢谢,我找到办法了!
strcpy(ret, temp);
char * ret = new char[str.size()+1];