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数组应该没关系吗?或者你不能释放这样的记忆吗?
答案 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"