2012-04-22 4 views
0

Я пытаюсь сделать некоторую практику для распределения памяти.Где я могу освободить память после выделения?

У меня есть код ниже, который работает, но у вас есть два вопроса.

Где я могу использовать delete [] для освобождения памяти после выделения?

Почему вывод для этого кода при использовании функции show() является CDcar ?.

#include <cstdlib> 
#include <new> 
#include <iostream> 
#include <cstring> 
using namespace std; 

class automobile { 

    private: 

     char (*function)[30]; 
     char *type; 
     double speed; 

    public: 

     automobile (); 
     automobile (double , char *); 
     void speed_up (double); 
     void speed_down(double); 
     const char * get_function () const; 
     void show (); 

}; 

automobile::automobile () { 

    speed = 0; 
    function = new char [1][30]; 
    strcpy(function[1], "CD player with MP3"); 

    type = new char [4]; 
    strcpy(type, "car"); 

} 

automobile::automobile(double spd, char * fn) { 

    int sz; 

} 

void automobile::show () { 

    cout << "This is a " << type << " and it has the following functions: " << function[1] << ", and its speed is " << speed << " km/h\n"; 

} 

int main () { 

    automobile car; 

    car.show (); 

    return 0; 
} 

это выход:

This is a car and it has the following functions: CDcar, and its speed is 0 km/h 

Я думал, что выход Шоуда быть таким:

This is a car and it has the following functions: CD player with MP3, and its speed is 0 km/h 

Пожалуйста посоветуйте

+2

Почему название и вопрос разные ??? – UmNyobe

+1

Почему вы не используете 'std :: string', ahmad? – jrok

+0

@UmNyobe Вопрос в том, где я должен освободить память, а плитка - то же самое. но у меня есть другой вопрос о выходе. – Jack

ответ

6

Где я должен использовать удалить [], чтобы освободить память после выделения?

Идеально негде. new и delete - это функции C++, которые не подходят для большинства кодов. Они подвержены ошибкам и слишком низки. Они полезны только для базовых строительных блоков.

Показанный код может быть полезен из основных строительных блоков, таких как std::string, std::vector.


Код, показанный также вызывает неопределенное поведение, по крайней мере в одном месте:

function = new char [1][30]; 
strcpy(function[1], "CD player with MP3"); 

Массивы 0 на основе, так что function[1] является вне ограничивает доступ.

+0

Благодарим вас за ответ. – Jack

1

Внутри ~ автомобильный деструктор.

4

Вы должны позвонить delete[] в деструктор вашего класса.

//Called when your class is destroyed. 
automobile::~automobile() 
{ 
    delete[] function; 
} 
+1

спасибо. Как насчет выхода? – Jack

2
  1. Вы должны поместить delete[] для function и type в пределах destructor~automobile (вы не один в настоящее время, так что вам придется создать его).

  2. Относительно вывода: Ваш символ массива не определен. Рассмотрите возможность использования std::vector<string> для таких вещей (намного проще).

2

Ваш вывод неверен б/с из следующих действий:

speed = 0; 
function = new char [1][30]; 
strcpy(function[1], "CD player with MP3"); 

Это должно быть

speed = 0; 
function = new char [1][30]; 
strcpy(function[0], "CD player with MP3"); 

и при выводе вы должны быть cout'ing function[0] вместо function[1].

Сказав это, вы должны почти всегда пытаться устранить ручные вызовы для новых и удалить. Это помогает в ремонтопригодности и помогает избежать исключения кода. В этом случае вы можете получить это бесплатно, используя векторы и строки, предоставленные стандартной библиотекой C++. В более общем смысле вы хотите следовать за RAII Idiom. Это поможет C++ и управлению памятью от бритья на пару лет от вашей жизни во время учебы/карьеры.

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