2015-10-09 21 views
-2
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: Вот эта функция:Удаление динамического массива в C++

Это приводит к сбою, если я запускаю его, но если я переведу оператор delete [] fname после возвращаемого statmenet, он работает просто хорошо. Почему он сбой, когда я удаляю [] fname перед оператором return? Я конкатенировал fname в lname и возвратил lname. Не имеет значения, удаляю ли я массив fname перед возвратом? Или вы не можете выпускать такую ​​память?

+0

Pleeeease не выполняет управление памятью самостоятельно. Вместо этого используйте 'std :: string' для вашего конкретного варианта использования. –

+0

Что касается вашего вопроса, ваш оператор 'delete [] lname;' никогда не выполняется, потому что раньше у вас есть 'return'. Вероятно, _crash_, потому что ваши распределения массивов слишком малы, чтобы удерживать результат, созданный 'strcat()'. –

+0

И, по крайней мере, код, который вы показываете в своем вопросе, не компилируется. –

ответ

1

Это не очень хороший код C++. Прежде всего, это не действительно элегантный doint, что вы делаете

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

функция не должна создавать что-то с его параметрами, он должен быть копией, указатель или referce к объекту.

Во-вторых, это нормально, что это не сбой, если вы поместите свое удаление после возвращения, потому что оно никогда не будет удалено. Возврат завершит выполнение функции, а другая часть кода не будет выполнена.

В-третьих, вы должны использовать строки в C++. Строки управляют памятью самим собой, и вам не нужно делать такие ужасные вещи.

Лучшим способом вашей функции может быть.

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

И вы можете использовать его как то

names("MyName", "MyLastName"); 

//Result 
"MyName, MyLastName" 

С пути (вы должны учитывать, что ваш буфер достаточно поэтому дают достаточно размер буфера)

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" 
+0

Я знал, что использование строк будет лучшим вариантом, я просто пытался использовать динамические массивы для практики. Я не понимаю, как вы освободите память перед возвратом массива. Или динамическая память не работает правильно таким образом? – Jess

+0

Если вы хотите сделать это с помощью C-способа, вы должны принять указатель на char, который вызывает вызывающую часть вашего кода, и вам нужно всего лишь сделать манипуляцию. –

+0

О, хорошо, спасибо! – Jess

Смежные вопросы