2012-12-20 81 views
4

我每次讀取文件時都嘗試讀取使用不同長度字節的二進制文件。獲得值後,我嘗試將字節轉換爲char*刪除用於字節轉換的char *

我創建了一個簡單的代碼如下:

//This code is compiled in Visual Studio 2010 
typedef unsigned char BYTE; 

BYTE *s; 
s = new BYTE[3]; // I read 2 bytes from the file, I add +1 to reserve NULL 
s[0]= 'a'; s[1]='b';s[2]=NULL; //just an example I get 2 bytes from file 

char* b; 
b = new char(sizeof(s)); 
strcpy(b,(char*)s); 
s[0]='x'; 
cout << s <<"--"<< b<< "--"<< endl; 
delete[] s; 
delete[] b; 
cin.get(); 
return 0;` 

但是,代碼生成錯誤「堆損壞檢出」。當我刪除該行,delete[] b;該程序運行良好。但是,如果問題可能出現,我不確定。有人會解釋一下嗎?如果我刪除delete[] b;會造成內存泄漏嗎?任何建議,以改善我的代碼?

+0

對不起。這是一個錯字,它應該是's'。 – user1917485

+0

您可以隨時編輯您自己的帖子,方法是點擊它下面的「編輯」鏈接按鈕。 :) – ForceMagic

回答

3

雖然大衛·撒克遜人解釋你的錯誤的直接原因,你的代碼可以顯著通過使用C++標準庫的改進:

//This code is compiled in Visual Studio 2010 
typedef unsigned char BYTE; 

//s will be automatically destroyed when control leaves its scope 
//so there is no need for the `delete[]` later on, and there 
//will be no memory leaks if the construction of `b` fails. 
std::vector<BYTE> s(3);// I read 2 bytes from the file, I add +1 to reserve NULL 
s[0]= 'a'; s[1]='b';s[2]=NULL; //just an example I get 2 bytes from file 
//`sizeof s` is wrong, as it gives the size of the `s` object, rather than 
//the size of the allocated array. 
//Here I instead just make `b` as a copy of `s`. 
std::vector<BYTE> b(s); 
s[0]='x'; 
cout << s.data() <<"--"<< b.data() << "--"<< endl; 
//There is no need for `delete[] s` and `delete[] b` as `s` and `b` 
//have automatic storage duration and so will automatically be destroyed. 
cin.get(); 
return 0;` 
+0

非常感謝您改進我的代碼。我現在可以看得更清楚了,我在這裏學到了新的東西。 – user1917485

7

此:

b = new char(sizeof(s)); 

應該是:

b = new char[sizeof(s)]; 

否則你沒有創建一個數組,你只是剛剛創建一個指針,指向具有的sizeof的字符代碼的字符(一)。

因此,刪除[] b導致它崩潰,因爲您試圖刪除沒有數組的數組。

另一個問題,sizeof(s)不會給你你想要的。 s是一個動態分配的數組,因此調用sizeof(s)是而不是會給你s中字符大小的總和。 sizeof(s)將返回s的指針大小。