36

CでのC++の新規/削除に相当するものは何ですか?

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

4

6 に答える 6

57

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

コンストラクタ/デストラクタを無視して安全性を入力する場合、最も近いのはmallocandfree関数です。

#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;
于 2010-05-15T09:07:22.120 に答える
11

コンストラクターは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);
于 2010-05-15T09:41:34.433 に答える
8

newC ++でのおよびの使用はdelete、動的メモリの割り当て/解放とオブジェクトの初期化/解放という2つの責任を組み合わせたものです。

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

newCでは、ほとんどの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はクライアントがとを使用する必要がないということです。mallocFILEmallocfree

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

pthread_t thread;

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

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

于 2010-05-15T10:47:27.720 に答える
3

正確なレプリカではありませんが、互換性のある同等のものは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
于 2010-05-15T09:13:38.477 に答える
1

malloc/free関数を使用します。

于 2010-05-15T09:20:13.237 に答える
1

遅いですが、私はこの構文が本当に好きですが、それが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);
}
于 2019-11-29T10:41:17.690 に答える