CのC++のnew/deleteに相当するものは何ですか?
それともC/C++でも同じですか?
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;
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);
C++でのnew
とdelete
の使用には、動的メモリの割り当てと解放、およびオブジェクトの初期化と解放という2つの役割があります。
他のすべての答えが言うように、動的メモリの割り当てと解放の最も一般的な方法は、malloc
とfree
を呼び出すことです。 OS固有の関数を使用して、大量のメモリを取得し、その中にオブジェクトを割り当てることもできますが、それはまれです-mallocが満たさないかなり特定の要件がある場合のみ。
Cでは、ほとんどのAPIがnew
とdelete
の他の役割を果たす関数のペアを提供します。
たとえば、ファイルapiは、オープン関数とクローズ関数のペアを使用します。
// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;
// C
FILE *fp=fopen("c:\\test.txt", "r");
fclose(fp);
fopen
はmalloc
構造体にストレージを割り当てるためにFILE
を使用するか、プロセス開始時にファイルポインターの最大数のテーブルを静的に割り当てる場合があります。ポイントは、APIがmalloc
とfree
を使用することをクライアントに要求しないことです。
他のAPIは、クライアントコードが自動、静的、または動的ストレージのいずれかを使用できるようにするコンストラクターとデストラクターに相当する、コントラクトの初期化と解放の一部を実行するだけの機能を提供します。 1つの例はpthreads APIです。
pthread_t thread;
pthread_create( &thread, NULL, thread_function, (void*) param);
これにより、クライアントはより柔軟になりますが、ライブラリとクライアント間のカップリングが増加します-クライアントはpthread_t
タイプのサイズを知る必要がありますが、ライブラリが割り当てと初期化の両方を処理する場合、クライアントは知る必要はありませんタイプのサイズ。したがって、クライアントをまったく変更せずに実装を変更できます。どちらも、クライアントと実装の間の結合をC++ほどには導入しません。 (C++は、OO言語)よりも、vtablesを備えたテンプレートメタプログラミング言語と考える方がよい場合がよくあります)
正確なレプリカではありませんが、互換性があるのは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
Malloc/free関数を使用してください。