3

alloc/free と比較した new/delete 演算子について質問があります。

char* にメモリを動的に割り当てる場合、通常は calloc を使用するため、すべての予約ビットがゼロに設定されるため、nulltermination を気にする必要はありません。

char *string = new char[20] は char のサイズの 20 個の項目のみを予約しますか、それともそのメモリ領域のすべてのビットをゼロに設定しますか?

そうでない場合、このメモリで memset を使用してそれを達成できますか? memset または割り当てられたメモリをゼロにする他の方法が可能である場合、ネイティブの char 型に対して new 演算子をオーバーロードして、この作業を独自に行うことができますか?

4

3 に答える 3

6

使用する場合:

string = new char[20];

割り当てられた配列は初期化されません。デフォルトで初期化するには、次を使用する必要があります。

string = new char[20]();  // Allocates and initializes all members to 0

これは C++03 §5.3.4/15 に記載されています。

T 型のオブジェクトを作成する new 式は、そのオブジェクトを次のように初期化します。

new-initializer の形式が () の場合、項目は値で初期化されます (8.5)。

2 番目の質問については、はい、 を使用memsetして任意の値でメモリを埋めることができます。

于 2013-01-08T17:26:52.867 に答える
1

char * string = new char[20]割り当てられる前に割り当てられたメモリにあるもので満たされます。

配列を 0 に memset して、目的を達成できます。

char * string = new char[20];
memset(string, 0x00, sizeof(char) * 20);

new を上書きすることもこれを行うことができます。

void* operator new(size_t n){
   void * mem = malloc(n);
   memset(mem, 0x00, n);
   return mem;
}
于 2013-01-08T17:23:40.527 に答える
1

newプリミティブ型 ( など) をゼロで初期化しませんchar。を使用してmemsetも問題ありませんが、慣用的な C++ の方法は次のように使用することstd::fillです。

std::fill(string, string+length, 0);

もちろん、文字列が必要な場合はstd::string、C++ で a を使用する必要があります。

于 2013-01-08T17:23:57.027 に答える