web-dev-qa-db-ja.com

CのC ++のnew / deleteに相当するものは何ですか?

CのC++のnew/deleteに相当するものは何ですか?

それともC/C++でも同じですか?

25
httpinterpret

Cにはnew/delete式はありません。

コンストラクタ/デストラクタとタイプセーフティを無視する場合、最も近いものは mallocおよびfree関数 です。

#include <stdlib.h>

int* p = malloc(sizeof(*p));   // int* p = new int;
...
free(p);                       // delete p;

int* a = malloc(12*sizeof(*a));  // int* a = new int[12];
...
free(a);                         // delete[] a;
44
kennytm

C++では、コンストラクターが例外をスローする場合があることに注意してください。 player* p = new player();に相当するものは、Cでは次のようになります。

struct player *p = malloc(sizeof *p);
if (!p) handle_out_of_memory();
int err = construct_player(p);
if (err)
{
    free(p);
    handle_constructor_error();
}

デストラクタは決して「投げる」べきではないため、delete pと同等のものはより単純です。

destruct(p);
free(p);
7
fredoverflow

C++でのnewdeleteの使用には、動的メモリの割り当てと解放、およびオブジェクトの初期化と解放という2つの役割があります。

他のすべての答えが言うように、動的メモリの割り当てと解放の最も一般的な方法は、mallocfreeを呼び出すことです。 OS固有の関数を使用して、大量のメモリを取得し、その中にオブジェクトを割り当てることもできますが、それはまれです-mallocが満たさないかなり特定の要件がある場合のみ。

Cでは、ほとんどのAPIがnewdeleteの他の役割を果たす関数のペアを提供します。

たとえば、ファイルapiは、オープン関数とクローズ関数のペアを使用します。

// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;

// C
FILE *fp=fopen("c:\\test.txt", "r"); 
fclose(fp);

fopenmalloc構造体にストレージを割り当てるためにFILEを使用するか、プロセス開始時にファイルポインターの最大数のテーブルを静的に割り当てる場合があります。ポイントは、APIがmallocfreeを使用することをクライアントに要求しないことです。

他のAPIは、クライアントコードが自動、静的、または動的ストレージのいずれかを使用できるようにするコンストラクターとデストラクターに相当する、コントラクトの初期化と解放の一部を実行するだけの機能を提供します。 1つの例はpthreads APIです。

pthread_t thread;

pthread_create( &thread, NULL, thread_function, (void*) param); 

これにより、クライアントはより柔軟になりますが、ライブラリとクライアント間のカップリングが増加します-クライアントはpthread_tタイプのサイズを知る必要がありますが、ライブラリが割り当てと初期化の両方を処理する場合、クライアントは知る必要はありませんタイプのサイズ。したがって、クライアントをまったく変更せずに実装を変更できます。どちらも、クライアントと実装の間の結合をC++ほどには導入しません。 (C++は、OO言語)よりも、vtablesを備えたテンプレートメタプログラミング言語と考える方がよい場合がよくあります)

6
Pete Kirkham

正確なレプリカではありませんが、互換性があるのはmallocとfreeです。

<data-type>* variable = (<data-type> *) malloc(memory-size);
free(variable);

コンストラクタ/デストラクタはありません-とにかくCにはありません:)

メモリサイズを取得するには、sizeof演算子を使用できます。

多次元配列を使用する場合は、複数回使用する必要があります(newなど)。

int** ptr_to_ptr = (int **) malloc(12 * sizeof(int *)); //assuming an array with length 12.
ptr[0] = (int *) malloc(10 * sizeof(int));   //1st element is an array of 10 items
ptr[1] = (int *) malloc(5 * sizeof(int));    //2nd element an array of 5 elements etc
3
Gaurav Vaish

Malloc/free関数を使用してください。

2
Ashish Jindal