C ++如何删除本地分配的char数组?

时间:2015-04-03 19:23:02

标签: c++ arrays pointers char local

我编写了一个函数,它接收一个char指针作为参数,然后构建一个包含该参数char的新动态分配char数组。然后,它返回新的char数组。 这是功能:

 char* read_string(char *pstr)

    {
        char *str;
        str = new char[strlen(pstr)];//allocate memory for the new char
        str[strlen(pstr)] = '\0';
        for(unsigned i=0;i<strlen(pstr);i++)//build the new char
            str[i]=pstr[i];
        return str;//then return it
    }

主要是我:

int main()

    {
        char *Pchar = read_string("Test");

        cout<<Pchar;// Outputs "Test"

        delete [] Pchar;//"Program received signal SIGTRAP, Trace/breakpoint trap." error
    }

我在main中声明了一个char指针,然后让它指向从read_string函数返回的char数组。它输出我想要的但是如果我想释放内存它会给我运行时错误。我怎么能免费如果我不再需要使用Pchar了,那就记住了吗?

编辑:谢谢大家提供的非常有用的答案。我已成功解决了这个问题。

3 个答案:

答案 0 :(得分:2)

您的具体问题是一个错误:

str = new char[strlen(pstr) + 1];
//                         ^^^^ need one more for the '\0'
str[strlen(pstr)] = '\0';

通常,由于这是C ++而不是C,最好返回智能指针,以便调用者知道指针的所有权语义是什么:

std::unique_ptr<char[]> read_string(char *pstr)
{
    std::unique_ptr<char[]> str(new char[strlen(pstr) + 1]);
    // rest as before
    return str;
}

答案 1 :(得分:2)

您需要分配更多内存以获得EOS字符的空间:

str = new char[strlen(pstr)+1];

答案 2 :(得分:2)

似乎由于分配的字符串的长度不正确而发生错误。 您必须使用以下记录来分配字符串

    str = new char[strlen(pstr) + 1];//allocate memory for the new char
    str[strlen(pstr)] = '\0';

该功能可以按以下方式查看

char* read_string( const char *pstr )
{
    char *str;
    size_t n = strlen( pstr );

    str = new char[n + 1];//allocate memory for the new char

    strcpy( str, pstr );

    return str;
}