返回一个字符串,但得到垃圾

时间:2016-05-31 15:04:48

标签: 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;
}

但是当我尝试在另一个地方打印时:

const char* str= exc.what();
std::cout << str;

输出是垃圾。

我认为问题是char []并且它应该是char *,但是当我将其更改为

char* ret="";

程序在

崩溃
strcpy(ret, temp);

有人可以帮帮我吗? 附:该函数必须返回一个const char *

3 个答案:

答案 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已经提供机制来完成这项工作?您只需将所需的消息传递给其构造函数。

请参阅http://en.cppreference.com/w/cpp/error/runtime_error