C ++はnew forシステムコールを使用してメモリを割り当てます。C言語のmallocとの本質的な違いは、mallocはヒープ上のメモリの一部を開くだけですが、newはメモリを開くだけでなく、オブジェクトコンストラクターを呼び出して初期化し、最終的に対応するポインターを返します。 。
例:A * p = new A;
A * p = new(std :: nothrow)A; //メモリの割り当てに失敗した場合、例外はスローされず、NULLポインターが返されます。
さらに、関数としてのnewは、指定されたメモリにオブジェクトを割り当てて構築できます。
フォームは次のとおりです:
new(ptr)A();
配置newを使用してオブジェクトをスタックに割り当てます:
char buff [1024];
memset(buffer、0、sizeof(buffer));
A * p = new(buff)A() ;
ネットワークIOでプロトコルを送信する場合、データは可変長であり、新しい配置を使用する必要がある場合があります。
たとえば、契約の内容は次のとおりです。
#pragma pack(1)// 1バイトのペア
列挙型eEventType
{ eEventType_PlayInfo = 1、 eEventType_Max };
struct stEvent
{ unsigned short eventTyp; // eEventType stEvent(eEventType _etype):eventTyp(_etype){} virtual〜stEvent(){} };
struct stPlayerInfo
{ stPlayerInfo():stEvent(eEventType_PlayInfo){} int passward ; char name [32]; intサイズ; char data [0]; }; 可charchar バッファ[1024]; memset(バッファ、0、sizeof(バッファ)); stPlayerInfo * pSend = new(buffer)stPlayerInfo(); pSend-> passward = 123456; char someData [] = "hhhh sllll ss"; pSend-> size = strlen(someData); memcpy(pSend-> data、someData、pSend-> size); ...... //最後に将データ投稿送出去 write(sock、pSend、sizeof(stPlayerInfo)+ pSend-> size);
実際、関数をカプセル化して、コンストラクター
テンプレート<クラスT>
void配置(T * p)を指定したメモリに 呼び出すだけです
{ new(static_cast <void *>(p))T(); }
これは、
バッファ[1024]を充電できます。
memset(バッファ、0、sizeof(バッファ));
stPlayerInfo * pSend =(stPlayerInfo *)buffer;
配置(pSend);