newを使用して、指定されたメモリにオブジェクトを構築します

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);

おすすめ

転載: blog.csdn.net/qq_19825249/article/details/106815102