2013-11-10 3 views
1

Я недавно сделал домашнее задание в школе и потерял очки, в комментарии грейдер сказал, что я не освободил указателей правильно. Ниже приведен код, который я отправил, я просто хотел бы знать, как он будет выглядеть, чтобы правильно освободить указатели?Освобождение динамической памяти

/*Student: Daniel 
*Purpose: To reverse a string input using 
*pointers. 
*/ 
#include <iostream> 
#include <cstring> 
#include <string> 
using namespace std; 

int main() { 
    string input; 
    char *head = new char, *tail = new char; 
    char temp; 
    //Get the string from the user that will be reversed 
    cout << "Enter in a string that you want reversed: "; 
    getline(cin, input); 
    //Create and copy the string into a character array 
    char arr[input.length()]; 
    strcpy(arr, input.c_str()); 
    //Set the points of head/tail to the front/back of array, respectably 
    head = &arr[0]; tail = &arr[input.length()-1]; 
    for(int i=0; i<input.length()/2; i++) { 
     temp = *(tail); 
     *tail = *head; 
     *head = temp; 
     tail --; head ++; 
    } 
    for(int i=0; i<input.length(); i++) { 
     cout << arr[i]; 
    } 
    //********MY PROBLEM AREA************* 
    delete head; delete tail; 
    head = NULL; tail = NULL; 
    return 0; 
} 
+0

'char arr [input.length()];' - это не законный C++. Для массивов с переменным размером вы на самом деле * должны * нуждаться в динамическом распределении. Даже если это было законно, это один символ меньше, чем необходимо. Вам нужно пространство для нулевого терминатора. –

ответ

7

Так посмотрите здесь ...

char *head = new char, *tail = new char; 

А потом ...

//Set the points of head/tail to the front/back of array, respectably 
head = &arr[0]; tail = &arr[input.length()-1]; 

Вы переназначить, что head и tail пункт, так что вы на самом деле не удалять правильные вещи, когда вы вызываете delete. На самом деле, я удивлен, что вы не рухнули.

Действительно вы, вероятно, может просто сделать:

char *head = NULL; char* tail = NULL; 

, а затем ничего не удалять, так как вы не будете иметь ничего динамического.

+0

Спасибо за ответ. Так что было бы лучше инициализировать их «NULL» вместо «нового символа»? И даже не нужно будет удалять указатели? – Exception

+0

Да - в этом случае это работает. Существуют и другие случаи, когда работа с только выделенной памятью стека недостаточна. –

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