在C ++中删除动态数组

时间:2015-10-09 01:23:59

标签: c++ arrays

char * names( char * fname = new char[ 15 ], char * lname new char[ 25 ] )
{
     lname[ strlen( lname ) ] = ','; //adds a comma
     lname[ strlen( lname ) ] = ' '; //adds a space(lastname, firstname)
     strcat( lname, fname ); //concatenate fname to lname

     delete[ ] fname; //delete array
     return lname; //return lname
     delete[ ] lname; //delete array
}

我对C ++中的动态数组没有太多经验,但我在我制作的函数中使用了一个。我的理解是你可以在完成使用数组后释放内存。但是如果在使用return语句之前删除它,程序会崩溃:这是函数:

如果我运行它会使它崩溃,但是如果我在返回statmenet之后移动delete [] fname语句,它就可以正常工作。当我在return语句之前删除[] fname时为什么会崩溃?我将fname连接到lname并返回lname。如果我在返回之前删除fname数组应该没关系吗?或者你不能释放这样的记忆吗?

1 个答案:

答案 0 :(得分:1)

这不是一个非常好的c ++代码。首先,它不是真正的优雅,你做什么

char * names( char * fname = new char[ 15 ], char * lname new char[ 25 ] )

函数不应该用他的参数创建一些东西,它应该是副本,指针或对象的引用。

第二件事,如果你在返回后把你的删除它没有崩溃是正常的,因为它永远不会删除。返回将结束函数,代码的其他部分将不会执行。

第三,你应该在C ++中使用字符串。字符串由他们自己管理记忆,你不需要做那样可怕的事情。

更好的功能可以是。

std::string names(std::string fname, std::string lname)
{
    std::string fullname = lname + " ," + fname;
    return fullname;
}

你可以像那样使用它

names("MyName", "MyLastName");

//Result
"MyName, MyLastName"

C方式(你应该考虑你的缓冲区足够,以便提供足够的缓冲区大小)

void name(char* infname, char* inlname, char* outfullname)
{
    char* a = ", "
    strcat(outfullname, inlname);
    strcat(outfullname, a);
    strcat(outfullname, infname);
}

所以你可以像

一样使用它
char fname[200];
char lname[200];
char fullname[500];

strcpy(fname, "MyName");
strcpy(lname, "Mylname");

name(fname, lname, fullname);

//fullname will be
"Mylname, MyName"