2015-11-03 30 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',而不是''用'new'來使用'char *'。這幾乎可以自動解決你的內存泄漏問題 - 好吧,如果你有點小心。使用'new'是低級編程的事情,通常要避免。假設'songTitle'的初始化沒有被分配到'songTitle',那麼你或多或少是正確的,雖然漏了。你需要確定內存在哪裏釋放。如果在兩個操作之間沒有'delete [] songTitle;'',則初始化和賦值確定會泄漏內存。 –

+1

'if(inFile.eof()== true)'應該是'if(!inFile)' –

回答

0

OP闡明,它們被卡住字符數組。這是不幸的,但在所有上述情況下,似乎根本不需要任何動態分配。濫用關於不斷升級的傷害的老式功夫教學,新的本地教育。 malloc之前新增。

當它們通過scope時,局部變量自毀。例如,你不能從函數中返回一個,因爲當結束時它們被銷燬。但你永遠不必擔心清理。您確切知道它何時創建,以及它何時會被銷燬。

要使用局部變量,您需要知道它有多大,廣告會在多長時間內出現。當您不知道其中一項或兩項時,請轉到層級中的下一項:new

new發生比本地分配更大的風險。任何new必須在不再需要時用delete發佈。這是程序員手中的額外記錄,可能已被忘記或未涵蓋在代碼的所有可能流程中。這被稱爲內存泄漏。 new也提供了正確大小的內存分配,並調用複雜對象的構造函數,確保它們被正確初始化。

mallocnew具有大致相同的泄漏風險等級,但malloc要求程序員指定正確的大小,從而打開拼寫錯誤和其他人爲錯誤的可能性。它不能用於創建複雜的數據類型。它提供原始內存,但不調用任何構建邏輯。這是相反的,free只會回憶內存。沒有析構函數被調用。

對於歌詞,可以使用malloc,因爲char是一個簡單的數據類型,但需要額外的數學才能獲得正確的大小並強制轉換數據類型。額外風險。 new消除了鑄造和大小錯誤的可能性,但仍需要手動內存管理。數組的大小已知,因此滿足使用局部變量的第一個要求。變量的使用壽命未知。

如果setTitle被分配songtitle成員變量,壽命延長和

char* songTitle = new char[50]; 

可能是最好的選擇。如果setTilesongtitle複製到成員變量中,則壽命是已知的並且是短的。在這種情況下,請使用局部變量:

char songTitle[50];