2009-07-02 16 views
8

"new"演算子を使用して任意のメモリブロックを割り当てることはできますか? Cでは、 "void * p = malloc(7);"のようにすることができます。 - メモリの配置が1バイトに設定されている場合、7バイトを割り当てます。新しい演算子でC++で同じようにするには?C++でのメモリ割り当て

答えて

43

任意のメモリブロックはC++でoperator newで割り当てることができます。オブジェクトを構築するための演算子であるnewではありません。

void* pBlock = ::operator new(7); 

このようなブロックは、その後、operator deleteで解放することができます。

::operator delete(pBlock); 

operator newは、メモリが適切にオブジェクトの任意の並べ替えのために整列しないので、実装は正確に7バイトを割り当て、それ以上ではないかもしれませんが、同じことが(通常は)mallocの真で割り当てられますのでご注意ください。 mallocのCクライアントは、通常、整列されたメモリも必要です。

+7

+1は、malloc&freeなしでそれを行う方法です。 –

+1

また、演算子newは、通常、とにかく(私が気づいているすべての実装で)malloc()にバックを渡すことに注意してください。 dominicが言ったように、mallocを使うだけかもしれません。 –

+1

ありがとうございました。それは答えです( ":: operator new")。私はなぜ ":: new(x);"という理由を理解しようと多くの時間を費やしました。動作しません:) – user132349

8

あなたがC++の演算子newvoidポインタを割り当てることができません。

char *p = new char[7]; 
uint8_t *q = new uint8_t[7]; 
... 
delete [] p; 
delete [] q; 
2

私はあなたがPlacement Newを探しているかもしれないと思う:あなたのようなcharuint8_tは、明示的な型を割り当てる必要があります。

+1

プレースメントの新機能などのテクニックを使用する場合は、追加するだけです。本当に必要な場合にのみ使用してください! –

+5

プレースメントは新しいメモリの割り当てとどのように関連していますか? – avakar

+0

@Miky D:リンク先のページに「危険」という言葉をすべて大文字で入れている理由は同意します。 :-) –

2

new char [7];

従来、charはバイトですが、BYTE型をtypedefするライブラリがあります。

+5

問題ではありません。 charは、実装が処理できる最小の型です。 charが16ビットの場合、バイト型は16ビットより小さくなることはできません。 sizeof(char)== 1.常に。 –

+0

@David Thornley:sizeof(char)は必要ありません1、そうでなければあらゆる種類のマーシャルライブラリがひどく動揺します。 – florin

+1

@florin:sizeof(char)== 1に準拠しています。 ISO/IEC 14882:2003の5.3.3節を参照のこと。 "sizeof(char)、sizeof(signed char)およびsizeof(unsigned char)は1であり、他の基本型(3.9.1)に適用されるsizeofの結果は実装定義です。 –

2

あなたはchar* pBuffer = new char[7];を実行できます。また、sizeof(char)は1バイトなので、バイトバッファとして使用できます。また、メモリを解放するときは、delete[]([]付き)を使用することを忘れないでください。

11

他の人が書いたように質問に答えてくれましたが、私はmalloc/freeをそのような割り当てに固執することを提案したいと思います。

オブジェクトを割り当てるための新規および削除です。彼らは必要なメモリを割り当て、コンストラクタ/デストラクタを呼び出します。あなたがメモリの任意のブロックを必要としていることを知っているなら、mallocとfreeを使うのは完全に合理的です。

+1

しかし、C++のコードを書いているのであれば、オブジェクトを割り当てるために新しい/ deleteを使う方が良いと思います。 2種類のメモリ割り当て機能を持つことにより、混乱が増えます。 – Naveen

+1

-1。 new/deleteは、あなたが割り当て/割り当てを解除しても、言語構造であり、型の安全性を導入します。 malloc/freeは下位互換性のために残っているアーティファクトです。 – sharkin

+1

@RA、任意の一般的なバイトブロックが必要な場合、それらが特にcharまたはunsigned charか何かを信じることは得られません。void *はより正直で明示的です。 +1 mallocのために! –

3

はいできます。
あなたがやっていることによっては、より良い技術があるかもしれません。

質問を更新し、達成しようとしていることを教えてください。コンテクストが増えるほど、より良い解決策が提供される。

例:
(コンパイル時にサイズがわからないため)ソケットから読み込むバッファを動的に割り当てる場合。別の方法として、ベクトルを使用してそれを動的にサイズ変更する方法があります。最初の要素のアドレスを取ることによって、バッファの内部へのポインタを得ることができます。

3

個人的に私はstd::vector<char>を使用します。任意のバイトブロック(guaranteed to be contiguous)を取得するだけでなく、それらをRAIIラッパーで取得します。もちろん、(resize()、多分、別に)std::vector年代の方法のいずれかを使用する必要はありませんが、そのために何のペナルティもありません:

std::vector<char> buffer(7); 
void* p = &buffer[0]; 

あなたはstd::stringを使用することができますが、しかしstd::stringは、このオブジェクトが含まれている「を意味します印刷時に意味をなさない文字」と表示されます。std::vector<char>には、「このオブジェクトには任意のバイトグループが含まれています。