新/delete malloc/free深さ分析

2397 ワード

mallocとfreeはC言語でスタックメモリを割り当てて回収するための関数であり、newとdeleteはC++言語の導入のキーワードである.
--malloc関数
void *malloc( size_t size );

この関数は、何バイトのメモリを割り当てるかを示すパラメータを入力する必要があります.voidタイプのポインタを返します.
使用例:int*a=(int*)malloc(4*sizeof(int);
--free関数
void free( void *memblock );

この関数は、リサイクルされるスタックメモリのヘッダアドレスを入力する必要があります.
C言語のメモリの割り当てと解放については、比較的簡単で、特に注意すべき点はありません.
----------------------------------------------------------------------------
以下では、new/deleteの注意すべき詳細について重点的に説明します.new[]/delete[]は似ています.
+++の3種類のnew/delete+++
(1)new operator/delete operator
言語に組み込まれたオペレータは、プログラマによって動作を変更することはできません.
基本タイプでは、newは対応するメモリのみを割り当てます.deleteは割り当てられたメモリのみを回収します.
しかし、複合タイプの場合、newはメモリの割り当てに加えて、オブジェクトのコンストラクション関数を呼び出してオブジェクトを初期化します.deleteはメモリを回収するだけでなく、その前にオブジェクトの構造関数を呼び出してオブジェクトのクリーンアップを実行します.
(2)operator new/operator delete
Openator new/operator delete関数を記述することで、プログラマはメモリの割り当てと解放時に実行される操作をカスタマイズできます.
このようなタイプのnewとdeleteをできるだけ使わないと、複合タイプにいくつかの問題をもたらすことが多い.
注意:このカスタムnewとdeleteは、mallocとfreeと比較してコンストラクション関数とコンストラクション関数を呼び出すことはありません.
Openartor newの関数は、通常、次のように宣言されます.
void* operator new(size_t size);

呼び出し方法:
std::string* pStr = ::operator new(sizeof(std::string));

------
Openartor deleteの関数は、通常、次のように宣言されます.
void operator delete(void* pMem);

呼び出し方法:
::operator delete(pStr);

new []/delete []
void * operator new[] (size_t size);
void   operator delete[] (void* pMem);

(3)placement new
割り当てられた元のメモリがある場合があります.オブジェクトを構築する必要があります.placement newは、この目的を達成するために使用できます.placement newはc++標準ライブラリの一部であり、placement newを使用するにはincludeが必要です.placement newは、既存のメモリアドレスにオブジェクトを構築し、コンストラクション関数を呼び出します.
具体的な使い方:
class widget
{
public:
    widget(int n);
};

widget* constructWidgetInBuf(void* buf, int n)
{
    return new (buf) widget(n);
}

 
***newの異常処理***
newが大きな空間になったら、異常判断をしたほうがいいです.
try{
    int* pMem = new int[100000];
}
catch(std::bad_alloc& e)
{
    std::cout << e.what() << std::endl;
}

  
以上は#includeが必要です.