8

「new」演算子を使用して任意のメモリブロックを割り当てることは可能ですか?CIでは、「void * p = malloc(7);」のように実行できます。-メモリアライメントが1バイトに設定されている場合、これは7バイトを割り当てます。新しい演算子を使用してC++で同じものを作成するにはどうすればよいですか?

4

8 に答える 8

45

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

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

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

::operator delete(pBlock);

operator newは、あらゆる種類のオブジェクトに適切に配置されたメモリを割り当てるため、実装は正確に7バイト以上を割り当てない可能性がありますが、(通常は)同じことが(通常)当てはまりますmalloc。通常のCクライアントにはmalloc、整列されたメモリも必要です。

于 2009-07-02T15:51:21.967 に答える
11

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

newとdeleteは、オブジェクトを割り当てるためのものです。必要なメモリを割り当て、コンストラクタ/デストラクタを呼び出します。任意のメモリブロックが必要であることがわかっている場合は、mallocとfreeを使用するのが完全に合理的です。

于 2009-07-02T15:50:03.857 に答える
8

voidC ++の演算子を使用してポインタを割り当てることはできません。または:newなどの明示的な型を割り当てる必要があります。charuint8_t

char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
于 2009-07-02T15:46:42.813 に答える
3

はい、できます。
しかし、あなたがしていることに応じて、より良いテクニックがあるかもしれません。

質問を更新して、達成しようとしていることを教えてください。より多くのコンテキストで、より良いソリューションが提供される可能性があります。

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

于 2009-07-02T16:16:05.470 に答える
3

個人的にはを使用しstd::vector<char>ます。任意のバイトブロック(連続していることが保証されている)を取得するだけでなく、RAIIラッパーで取得します。もちろん、std::vector(多分、を除いて)のメソッドを使用する必要はありませんresize()が、そのためのペナルティはありません。

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

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

于 2009-07-02T18:00:15.620 に答える
2

新しい配置を探しているのではないかと思います。

于 2009-07-02T15:46:55.667 に答える
2

新しいchar[7];

従来、charはバイトですが、BYTE型をtypedefするライブラリがいくつかある場合があります。

于 2009-07-02T15:46:57.243 に答える
2

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

于 2009-07-02T15:49:26.367 に答える