2015-11-03 2 views
0

Я работаю с преподавателем по одному из моих заданий, и внутри они использовали меня malloc. Мой инструктор говорит, что вместо этого я должен использовать новые. Чтобы перейти между ними, я хочу убедиться, что делаю это правильно.Переход от malloc к новому

Что я имел (пару примеров);

char* songTitle = (char*)malloc(sizeof(char)* 50); 

songTitle = (char*)malloc(sizeof(char)* 50); 

title = (char*)malloc(sizeof(char)* 50); 

Что я надеюсь на правильность перевода;

char* songTitle = new char[50]; 

songTitle = new char[50]; 

title = new char [50]; 

Пример фрагментов того, что я использую;

Отрывок # 1

cin.ignore(); 
cout << "What is the title of the song? " << endl; 
char* songTitle = (char*)malloc(sizeof(char)* 50); 
cin.getline(songTitle, 50); 
songTitle[0] = std::toupper(songTitle[0]); 

for (std::size_t i = 1; i < strlen(songTitle); ++i) 
    songTitle[i] = std::tolower(songTitle[i]); 

Отрывок # 2

cin.ignore(); 
cout << "What is the title of the song? " << endl; 
songTitle = (char*)malloc(sizeof(char)* 50); 
cin.getline(songTitle, 50); 
songTitle[0] = std::toupper(songTitle[0]); 

Отрывок # 3

while (true && count < ARRAY_SIZE) 
    { 
     title = (char*)malloc(sizeof(char)* 50); 
     artist = (char*)malloc(sizeof(char)* 50); 
     duration = (char*)malloc(sizeof(char)* 50); 
     album = (char*)malloc(sizeof(char)* 50); 

     inFile.getline(title, 50, '\|'); 
     songs[count].setTitle(title); 
     inFile.getline(artist, 50, '\|'); 
     songs[count].setArtist(artist); 
     inFile.getline(duration, 50, '\|'); 
     songs[count].setDuration(duration); 
     inFile.getline(album, 50, '\|'); 
     songs[count].setAlbum(album); 

     if (inFile.eof() == true) 
      break; 

     count++; 
    } 
+0

Предполагая, что все переменные имеют тип 'char *', и вы добавляете точки с запятой, да, это выглядит правильно. – Adam

+5

Действительно, вам следует перейти непосредственно к использованию 'std :: string', а не использовать' char * 'с' new'. Это устраняет проблемы с утечкой памяти почти автоматически - хорошо, если вы немного осторожны. Использование 'new' - это низкоуровневое программирование, которого обычно следует избегать. Предполагая, что за инициализацией 'songTitle' не следует присвоение' songTitle', вы более или менее корректны, хотя и негерметичны. Вам нужно решить, где освободится память. Инициализация и назначение окончательно утечки памяти, если нет 'delete [] songTitle;' между двумя операциями. –

+1

'if (inFile.eof() == true)' должно быть 'if (! InFile)' –

ответ

0

О.П. заявил, что они застряли массивы символов. Это несчастливо, но во всех вышеперечисленных случаях, по-видимому, нет необходимости в каком-либо динамическом распределении вообще. Чтобы злоупотреблять старым учением Gung-fu об эскалации уровней вреда, местный перед новым. Новое перед malloc.

Локальные переменные самоуничтожаются при их выходе из scope. Вы не можете вернуть его из функции, например, потому что они уничтожаются, когда завершается окончание. Но вам никогда не придется беспокоиться о чистке. Вы точно знаете, когда он был создан, и точно, когда он будет уничтожен.

Чтобы использовать локальную переменную, вам нужно знать, насколько велика ее реклама, как долго она будет. Если вы не знаете одного или обоих, перейдите к следующему в иерархии: new

new несет на себе больший риск, чем локальное распределение. Anything new ed должен быть выпущен с delete, когда он больше не требуется. Это дополнительный бухгалтерский учет в руках программиста и, возможно, был забыт или не был охвачен во всех возможных потоках кода. Это называется утечкой памяти. new также обеспечивает распределение памяти точно в нужном размере и вызывает конструкторы сложных объектов, гарантируя их правильную инициализацию.

malloc имеет примерно такой же уровень риска утечки как new, но malloc требует программист указать правильное определение размеров, открывая возможность опечаток и oyher человеческих ошибок. Он не может использоваться для сортировки сложного типа данных. Он обеспечивает необработанную память, но не вызывает никакой логики построения. Это контрапункт, free только положил память обратно. Деструкторы не называются.

Для названия песни malloc может использоваться, потому что char - простой тип данных, но для получения размера и правильности выбора типа данных требуется дополнительная математика. Дополнительный риск. new устраняет возможность ошибок при калибровке и калибровке, но при этом требует ручного управления памятью. Размер массива известен, поэтому выполняется первое требование использования локальной переменной. Продолжительность жизни переменной неизвестна.

если setTitle является назначение songtitle переменной-члена, срок продлевается и

char* songTitle = new char[50]; 

, вероятно, самый лучший вариант. Если setTile копий songtitle в переменную-член, срок службы известен и короток. В этом случае перейдите к локальной переменной:

char songTitle[50]; 
Смежные вопросы