在c++中删除动态数组

Deleting a Dynamic Array in C++

本文关键字:动态 数组 删除 c++      更新时间:2023-10-16
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语句之前删除它,程序就会崩溃:

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

这不是一个很好的c++代码。首先,你所做的不是很优雅

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

一个函数不应该用它的形参创建什么东西,它应该是一个对象的副本、指针或引用。

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

第三,你应该在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"