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

C++如何删除本地分配的字符数组?,c++,arrays,pointers,char,local,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(

我编写了一个函数,它接收一个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,如何释放内存


编辑:感谢大家提供了非常翔实的答案。我已成功地解决了问题。

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

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;
}

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

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;
}

您需要分配更多内存,以便为EOS字符留出空间:

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

您需要分配更多内存,以便为EOS字符留出空间:

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

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

    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;
}

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

    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;
}

您没有为空字符分配足够的内存,str[strlenpstr]超出了范围。@zenith我如何更正它?不要胡闹。使用std::string。我不允许在我的作业中使用STL不幸的是:strlen给出了字符串的长度,但没有终止null。您还需要一个大小为strlenpstr+1的缓冲区来保存空字符。您没有为空字符分配足够的内存,str[strlenpstr]超出了范围。@zenith我如何更正它?不要胡闹。使用std::string。我不允许在我的作业中使用STL不幸的是:strlen给出了字符串的长度,但没有终止null。您还需要一个大小为strlenpstr+1的缓冲区来保存空值。strcpy也将执行空值终止符,因此您不需要额外的赋值。@Barry这是复制和粘贴的结果。:strcpy也将执行空值终止符,因此您不需要额外的赋值。@Barry这是复制和粘贴的结果。: