CでのC++の新規/削除に相当するものは何ですか?
それともC/C ++でも同じですか?
Cにはnew
/式はありません。delete
コンストラクタ/デストラクタを無視して安全性を入力する場合、最も近いのはmalloc
andfree
関数です。
#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);
new
C ++でのおよびの使用はdelete
、動的メモリの割り当て/解放とオブジェクトの初期化/解放という2つの責任を組み合わせたものです。
他のすべての回答が言うように、動的メモリを割り当てて解放する最も一般的な方法は、とを呼び出すことmalloc
ですfree
。OS固有の関数を使用して、大量のメモリを取得し、その中にオブジェクトを割り当てることもできますが、それはまれです。mallocが満たさないかなり特定の要件がある場合に限ります。
new
Cでは、ほとんどのAPIは、との他の役割を果たす一対の関数を提供しますdelete
。
たとえば、ファイルAPIは、オープン関数とクローズ関数のペアを使用します。
// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;
// C
FILE *fp=fopen("c:\\test.txt", "r");
fclose(fp);
構造体にストレージを割り当てるためにfopen
使用する場合もあれば、プロセス開始時にファイルポインタの最大数にテーブルを静的に割り当てる場合もあります。重要なのは、APIはクライアントがとを使用する必要がないということです。malloc
FILE
malloc
free
他のAPIは、コントラクトの初期化と解放の一部を実行するだけの関数を提供します。これは、コンストラクターとデストラクタに相当し、クライアントコードが自動、静的、または動的ストレージのいずれかを使用できるようにします。1つの例はpthreadsAPIです。
pthread_t thread;
pthread_create( &thread, NULL, thread_function, (void*) param);
これにより、クライアントはより柔軟になりますが、ライブラリとクライアント間の結合が増加します。クライアントはpthread_t
タイプのサイズを知る必要がありますが、ライブラリが割り当てと初期化の両方を処理する場合、クライアントはタイプのサイズを知る必要はありません。 、したがって、クライアントをまったく変更せずに実装を変更できます。どちらも、C++のようにクライアントと実装の間に多くの結合を導入しません。(多くの場合、C ++は、オブジェクト指向言語よりも、vtablesを使用したテンプレートメタプログラミング言語と考える方がよいでしょう)
正確なレプリカではありませんが、互換性のある同等のものはmallocで無料です。
<data-type>* variable = (<data-type> *) malloc(memory-size);
free(variable);
コンストラクタ/デストラクタはありません-とにかくCにはそれらがありません:)
メモリサイズを取得するには、sizeof
演算子を使用できます。
多次元配列を操作する場合は、(新規のように)複数回使用する必要があります。
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関数を使用します。
遅いですが、私はこの構文が本当に好きですが、それがCの方法に適合するかどうかはわかりません
#include <stdlib.h>
#define new(type, length) malloc(sizeof(type)*(length))
#define delete(x) free(x)
int main()
{
int *test = new(int, 30);
delete(test);
}