ホームページ > バックエンド開発 > C#.Net チュートリアル > C++ で new() 関数と malloc() 関数を学習する

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

little bottle
リリース: 2019-04-30 13:19:07
転載
3717 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
c++
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート