4

ファイルを読み取るたびに、異なる長さのバイトを使用してバイナリ ファイルを読み取ろうとしました。値を取得したら、バイトを に変換しようとします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;ますか? コードを改善するための提案はありますか?

4

2 に答える 2

7

これ:

b = new char(sizeof(s));

次のようにする必要があります。

b = new char[sizeof(s)];

それ以外の場合は、配列を作成していません。sizeof(a) の文字コードを持つ char へのポインターを作成しているだけです。

したがって、配列のない配列を削除しようとしているため、delete[] b が原因でクラッシュします。

また、別の問題である sizeof(s) では、必要なものが得られません。s は動的に割り当てられる配列であるため、sizeof(s) を呼び出しても、s の文字のサイズの合計は得られません。sizeof(s) は、s へのポインタのサイズを返します。

于 2012-12-20T03:03:10.193 に答える
3

David Saxon がエラーの直接の理由を説明していますが、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;`
于 2012-12-20T03:19:19.677 に答える