简体   繁体   中英

C++ how to delete local allocated char array?

I wrote a function which receives as a parameter a char pointer,then builds a new dynamic allocated char array that contains that parameter char.Then,it returns the new char array. This is the function:

 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
    }

In main I have:

int main()

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

        cout<<Pchar;// Outputs "Test"

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

I declare a char pointer in main and then make it point to the char array that is returned from the read_string function.It outputs what I want but if I want to free the memory it gives me runtime error.How can I free up the memory if I don't need to use Pchar anymore?

EDIT:Thank you all for your very informative answers.I have successfully resolved the problem.

Your specific problem is an off-by-one error:

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

Generally, since this is C++ and not C, it would be better to return a smart pointer so the caller knows what the ownership semantics of the pointer are:

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

It seems that the error occurs due to incorrect length of the allocated string. You have to use the following record to allocate the string

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

The function can look the following way

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM