メモリ管理
1. C / C ++メモリ分散
1.スタック領域は上位アドレスから下位アドレスに拡大し、非静的ローカル変数、関数パラメーターなどを
格納します。2。ヒープ領域は下位アドレスから上位アドレスに拡大し、malloc、新しい変数を格納します。
3.データセグメントはグローバル変数と静的変数を
格納します。4。コードセグメントは読み取り専用の一定の軽量で実行可能なコードを格納します。
2.C言語のメモリ管理から導入
C言語の動的メモリ管理:リンク。
これは、基本的な使用法と一般的なエラーを含む、C言語でのメモリ管理の動的開発に関するブロガーの要約です。
3. C ++メモリ管理
C ++では、システムはメモリ管理用に2つのキーワードを定義しています。
組み込み型の基本操作
注:単一要素のスペースを申請および解放するには、newおよびdelete演算子を使用し、連続スペースを申請および解放するには、new []およびdelete []を使用します。
管理対象オブジェクト
//申请空间
int* ptr = new int;
//申请空间并初始化
int* ptr2 = new int(1);
delete ptr;
delete ptr2;
オブジェクトの配列を管理する
//申请大小为4*10的连续空间
int* arr = new int[10];
//c++98不允许连续空间初始化
//c++11后支持
// int *arr =new[10](1);(是错误代码)
delete[] arr;
カスタムタイプの基本操作
組み込み型と比較して、カスタム型のnew関数とdelete関数はより豊富です
。newはコンストラクターを呼び出して初期化します(newはスペースのアプリケーションのみです)
deleteはデストラクタを呼び出してスペースをクリーンアップします
#include <iostream>
using namespace std;
class Test
{
public:
Test()
: _data(0)
{
cout << "Test():" << this << endl;
}
~Test()
{
cout << "~Test():" << this << endl;
}
private:
int _data;
};
void Test2()
{
// 申请单个Test类型的空间
Test* p1 = (Test*)malloc(sizeof(Test));
free(p1);
// 申请10个Test类型的空间
Test* p2 = (Test*)malloc(sizeof(Test) * 10);
free(p2);
}
int main()
{
Test* t = new Test;
delete t;
return 0;
}
それらのコンストラクタとデストラクタが呼び出され、それが物理空間であることがわかります。
注:
1。動的スペースを開くには、デフォルトの構造が必要です。
演算子new和演算子削除
1. newおよびdeleteは、ユーザーが動的メモリを適用および解放するための演算子です。演算子newおよびoperator deleteは、システムによって提供されるグローバル関数です。newは、下部にある演算子newグローバル関数を呼び出してスペースを適用し、deleteは演算子deleteを使用します。下部にあるグローバル関数。スペースを解放します。
2.演算子newは、実際にmallocを介してスペースを申請します。mallocがスペースの申請に
成功すると、直接戻ります。それ以外の場合は、ユーザー提供のスペース不足対策が実行されます。ユーザーがそのような対策を提供した場合、アプリケーションは続行されます。それ以外の場合は、例外がスローされます。演算子deleteは、最終的に空き領域を解放します。
演算子newはmallocと例外処理メカニズムをカプセル化していることが理解できます。
New&Delete実現の原則
void test1(){
//内置类型
int* ptr = new int;
//new->operator new->malloc
delete ptr;
//delete->operator delete->free
int* ptr1 = new int[10];
//new[]-> operator new[]-> operator new->malloc
delete[] ptr1;
//delete[]->operator delete[]->operator delete->free
//自定义类型
Test* t1 = new Test;
//new->operator new->malloc->构造
delete t1;
//delete->析构->operator delete->free
Test* t2 = new Test[10];
//new[]->operator new[]->operator new->malloc->10构造
delete t2;
//delete[]->10析构->operator delete[]->operator delete->free
}
malloc / freeとnew / deleteの違い
- mallocとfreeは関数、newとdeleteは演算子です
- mallocによって要求されたスペースは初期化されません。新しいものは初期化できます。
- mallocがスペースに適用される場合、スペースのサイズを手動で計算して渡す必要があります。新規の後にスペースのタイプを入力するだけで済みます。
- mallocの戻り値はvoid *であり、使用時に強制する必要があります。newの後にスペースのタイプが続くため、newは必要ありません。
- mallocがスペースの適用に失敗すると、NULLを返すため、使用する場合はnullである必要があります。newは必要ありませんが、newは例外をキャッチする必要があります。
- カスタムタイプのオブジェクトを申請する場合、newはコンストラクタを呼び出してスペースの申請後にオブジェクトの初期化を完了し、deleteはデストラクタを呼び出してスペースを解放する前にスペース内のリソースのクリーンアップを完了します。