ホームページ  >  記事  >  バックエンド開発  >  C++ で new() 関数と malloc() 関数を学習する

C++ で new() 関数と malloc() 関数を学習する

little bottle
little bottle転載
2019-04-30 13:18:223675ブラウズ

c に詳しい友人は、c がプログラマにメモリ管理などのハードウェアを扱う可能性を提供することを知っているはずです。高レベルの C プログラマは、C プログラムのパフォーマンスを極限まで最適化し、ハードウェア リソースを浪費することができます。ここで、メモリ管理に関連する new と malloc() について話したいと思います。

まず、malloc() について話しましょう。Malloc は、C 言語から継承された 関数 です。メモリの一部を割り当てるために使用されます。その戻り結果は、メモリへのポインタです。ポインタ、その関数プロトタイプ、および使用例は次のとおりです:

/*
  函数原型
  其中__size是你要分配的大小,其单位是byte
*/
void* malloc(size_t __size);

// 用例
int* pInt = (int*) malloc(sizeof(int));               // 分配了一个int
double* pDoubleArray = (double*) malloc(sizeof(double) * 5);   // 分配了一个double数组,其大小为5

一般に、malloc はいつでもメモリを割り当てることができます。しかし、状況が多すぎて記憶力が足りない場合もあります。このとき、malloc は null ポインタ (NULL、nullptr) を返します。 malloc を使用する場合は、返されるポインタが null かどうかを毎回確認することをお勧めします。

関連チュートリアル: C ビデオ チュートリアル

これで、メモリが割り当てられました。プログラムがある時点に達すると、メモリはもう必要なくなります。この時点で、手動でメモリを解放する必要があります。そうしないと、メモリ リークが発生します。 free() 関数を使用してメモリを解放します。関数のプロトタイプと使用例は次のとおりです:

// 原型
void free(void* __ptr);

// 用例
free(pInt);
free(pDoubleArray);

興味深いのは、free 関数に渡すのは単なるポインターですが、要素を割り当てるか、 array , free はいつでもこのメモリを解放するのに役立ちます (free は割り当てた配列のサイズをどのようにして知るのでしょうか?)

メモリを割り当てるときに malloc が何を行うか詳しく説明しましょう。 malloc がメモリを割り当てるときは、必要なメモリ サイズを割り当てるだけでなく、メモリの先頭と末尾に追加情報 (一般に cookie として知られています) も追加します。たとえば、デバッグに使用される情報やメモリのサイズなどです。これは、メモリのサイズを認識しているため、メモリを解放できる理由を説明します。これらの Cookie はある程度のメモリを消費することに注意してください。 。 。

さて、malloc の導入はほぼ完了しました。もう 1 つ言いたいのは、malloc は単なるサードパーティの機能であり、オペレーティング システムのカーネル機能ではないということです。追加のニーズがある場合は、独自の malloc を設計できます。次に新作についてお話します。

New は、c によって提供されるマニピュレータ (またはキーワード) です。メモリの割り当てにも使用されます。その使用例は次のとおりです:

int* pInt = new int(3);            // 分配并构造一个int
double* pDoubleArray = new double[5];    // 分配了一个double数组,其大小是5

delete pInt;                   // 删除单元素
delete[] pDoubleArray;             // 删除数组

これはまだ古いトピックです。一般的に、プログラムはメモリを割り当ててくれますが、本当に限界に達した場合はどうすればよいでしょうか? この時点で、プログラムは std::bad_alloc 例外をスローします。これが new と malloc の違いの 1 つであることに注意してください。 しかし、素晴らしいのは、C が bad_alloc 例外を処理するメカニズムを提供していることです。 set_new_handler は c によって提供されるメカニズムです。一般に、チップがダウンしたときにやるべきことは 2 つだけです。プログラムを終了させるか、別の場所にメモリを掘って割り当てを続行する方法を見つけてください。

new がキーワードであることはすでにご存知でしょう。プログラムの場合、すべてのアクションは関数呼び出しに戻ります。では、新品のときは一体何が起こったのでしょうか?新しいものを作成するとき、プログラムは最初に

::operator new() 関数を呼び出します。次に、::operator new() のプログラムが malloc() を呼び出します。 ###おお!すべてが明確になり、new の本質は malloc 関数を呼び出すことであることがわかりました。 !同様に、削除の本質は、free() 関数を呼び出すことです。 new の本質は malloc を呼び出すことですが、new と malloc の間には 1 つの大きな違いがあります。つまり、new がメモリから出た後、new はオブジェクトの構築に役立ちますが、malloc はメモリを割り当てるだけです。具体的な例は次のとおりです。

void BadAllocateHandler()
{
  std::cout << "啊,内存分配失败了" << std::endl;
  exit(0);
}

std::set_new_handler(BadAllocateHandler);

new の方法は、malloc がメモリを割り当てた後、コンパイラがクラスのコンストラクターを直接呼び出して、このメモリ内にオブジェクトを構築します。知らせ!コンパイラのみがクラスのコンストラクターを直接呼び出すことができます。また、malloc を使用する場合、その上にオブジェクトを直接構築することはできません。

以上がC++ で new() 関数と malloc() 関数を学習するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。