"new"演算子を使用して任意のメモリブロックを割り当てることはできますか? Cでは、 "void * p = malloc(7);"のようにすることができます。 - メモリの配置が1バイトに設定されている場合、7バイトを割り当てます。新しい演算子でC++で同じようにするには?C++でのメモリ割り当て
答えて
任意のメモリブロックはC++でoperator new
で割り当てることができます。オブジェクトを構築するための演算子であるnew
ではありません。
void* pBlock = ::operator new(7);
このようなブロックは、その後、operator delete
で解放することができます。
::operator delete(pBlock);
operator new
は、メモリが適切にオブジェクトの任意の並べ替えのために整列しないので、実装は正確に7バイトを割り当て、それ以上ではないかもしれませんが、同じことが(通常は)malloc
の真で割り当てられますのでご注意ください。 malloc
のCクライアントは、通常、整列されたメモリも必要です。
あなたがC++の演算子new
とvoid
ポインタを割り当てることができません。
char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
私はあなたがPlacement Newを探しているかもしれないと思う:あなたのようなchar
やuint8_t
は、明示的な型を割り当てる必要があります。
プレースメントの新機能などのテクニックを使用する場合は、追加するだけです。本当に必要な場合にのみ使用してください! –
プレースメントは新しいメモリの割り当てとどのように関連していますか? – avakar
@Miky D:リンク先のページに「危険」という言葉をすべて大文字で入れている理由は同意します。 :-) –
new char [7];
従来、charはバイトですが、BYTE型をtypedefするライブラリがあります。
問題ではありません。 charは、実装が処理できる最小の型です。 charが16ビットの場合、バイト型は16ビットより小さくなることはできません。 sizeof(char)== 1.常に。 –
@David Thornley:sizeof(char)は必要ありません1、そうでなければあらゆる種類のマーシャルライブラリがひどく動揺します。 – florin
@florin:sizeof(char)== 1に準拠しています。 ISO/IEC 14882:2003の5.3.3節を参照のこと。 "sizeof(char)、sizeof(signed char)およびsizeof(unsigned char)は1であり、他の基本型(3.9.1)に適用されるsizeofの結果は実装定義です。 –
あなたはchar* pBuffer = new char[7];
を実行できます。また、sizeof(char)は1バイトなので、バイトバッファとして使用できます。また、メモリを解放するときは、delete[]
([]付き)を使用することを忘れないでください。
他の人が書いたように質問に答えてくれましたが、私はmalloc/freeをそのような割り当てに固執することを提案したいと思います。
オブジェクトを割り当てるための新規および削除です。彼らは必要なメモリを割り当て、コンストラクタ/デストラクタを呼び出します。あなたがメモリの任意のブロックを必要としていることを知っているなら、mallocとfreeを使うのは完全に合理的です。
しかし、C++のコードを書いているのであれば、オブジェクトを割り当てるために新しい/ deleteを使う方が良いと思います。 2種類のメモリ割り当て機能を持つことにより、混乱が増えます。 – Naveen
-1。 new/deleteは、あなたが割り当て/割り当てを解除しても、言語構造であり、型の安全性を導入します。 malloc/freeは下位互換性のために残っているアーティファクトです。 – sharkin
@RA、任意の一般的なバイトブロックが必要な場合、それらが特にcharまたはunsigned charか何かを信じることは得られません。void *はより正直で明示的です。 +1 mallocのために! –
はいできます。
あなたがやっていることによっては、より良い技術があるかもしれません。
質問を更新し、達成しようとしていることを教えてください。コンテクストが増えるほど、より良い解決策が提供される。
例:
(コンパイル時にサイズがわからないため)ソケットから読み込むバッファを動的に割り当てる場合。別の方法として、ベクトルを使用してそれを動的にサイズ変更する方法があります。最初の要素のアドレスを取ることによって、バッファの内部へのポインタを得ることができます。
個人的に私は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>
には、「このオブジェクトには任意のバイトグループが含まれています。
- 1. メモリの割り当て/割り当て解除(WindowsではC++)
- 2. C++の動的割り当てメモリ内での動的メモリ割り当て
- 3. ポインタとCでのメモリ割り当て
- 4. Cでの動的メモリ割り当て
- 5. Cでのメモリ割り当て
- 6. ArcGIS C#のメモリ割り当てのクラッシュ
- 7. C++のメモリ割り当ての問題
- 8. 客観C:メモリの割り当て
- 9. c#3dアプリケーションのメモリ割り当て
- 10. C++リリース、メモリの割り当ては、コンストラクタ
- 11. 派生C++クラスのメモリ割り当て
- 12. C++メモリ割り当ての質問
- 13. C++のメモリ割り当てnew []とdelete []
- 14. Cのmallocメモリ割り当て方式
- 15. 割り当てメモリ**
- 16. メモリ割り当て
- 17. メモリ割り当て
- 18. 割り当てメモリ
- 19. メモリ割り当て
- 20. 割り当てメモリ
- 21. C++動的メモリ割り当て
- 22. オブジェクトにメモリを割り当てるC#
- 23. Dalvikのメモリ割り当て
- 24. Magentoのメモリ割り当て
- 25. iphoneのメモリ割り当て
- 26. プロセスのメモリ割り当て
- 27. メモリ割り当て - プロセスツリーの共通メモリ
- 28. UIViewController.viewのメモリ割り当て/割り当て解除
- 29. メモリ割り当てとループ
- 30. MySqlメモリ割り当て
+1は、malloc&freeなしでそれを行う方法です。 –
また、演算子newは、通常、とにかく(私が気づいているすべての実装で)malloc()にバックを渡すことに注意してください。 dominicが言ったように、mallocを使うだけかもしれません。 –
ありがとうございました。それは答えです( ":: operator new")。私はなぜ ":: new(x);"という理由を理解しようと多くの時間を費やしました。動作しません:) – user132349