C++学習ノート--newとnamespace

2108 ワード

メモリ申請
Cでは動的メモリ割り当て(小知識:一般的に動的に割り当てられたメモリ空間は必要なものよりやや大きい)の関数を学びましたが、なぜC++で新しいメモリ割り当て方法を学ぶのでしょうか.それは、Cのmalloc、calloc、などはCに付属しているものではなく、ライブラリ関数呼び出しによって得られるため、これらのライブラリコンパイラをサポートしないと使用できないものがあるからです.C++ではnewキー(表面はC++が付属しており、コンパイル環境に依存しない)を使用して動的メモリ割り当てを行い、Cでの動的メモリ割り当てはバイト割り当てに基づいているが、C++ではタイプに基づいて動的メモリ割り当てを行い、使用後にdeleteキーを使用してメモリを解放する.Newには、単一変数タイプ申請と配列申請の2つの方法があります.
変数申請:type*p=new type;
...
...
  delete p;
配列申請:type*p=new type[N];
...
...
delete []p;//単一変数の解放と区別
newが単一の変数タイプのメモリを割り当てるときに、申請の空間を初期化することができます.
int *pi = new int(1);
float *pf = new float(2.0f);
char * pc = new char('a');
注意:int*p=new int(2);int*p=new int[2]; //前者は初期化を行うが,後者は連続した空間を申請する.
Test *pm = new Test();//スタックにオブジェクトを作成します.
新とmallocの違い:
1、newキーワードはC++の一部であり、mallocはCライブラリから提供される関数である.
2、newは具体的なタイプ単位でメモリ割り当てを行い、mallocはバイト単位でメモリ割り当てを行う.
3、newは単一タイプ変数を申請する際に初期化することができ、mallocは初期化の特性を備えていない.
4、mallocは必要に応じて一定量のメモリスペースを申請するだけです.
5、newでクラスオブジェクトを申請すると呼び出し構造関数がトリガーされ、mallocで同じサイズの空間を申請するとこのメモリのヘッダアドレスだけが返されます.
6、オブジェクトの作成はnewのみで、mallocはオブジェクト向けの開発に適していない.
7、メモリを解放するとdeleteは構造関数の呼び出しをトリガーし、オブジェクトを完全に破棄します.freeは申請したメモリ空間を解放するだけですが、ポインタ自体は依然として存在します.
8、deleteとfreeは混用できない.deleteでmalloc申請の空間を解放すると、malloc申請の空間は合法的なオブジェクトを生成しないため、構造関数を呼び出すとプログラムがクラッシュする可能性がある.freeでnew申請のスペースを解放すると、オブジェクトが破棄されず、メモリが漏洩する可能性があります.
ネーミングスペース
Cには1つのグローバル役割ドメインしかなく、すべてのグローバル識別子が1つの役割ドメインを共有することで識別子間の衝突を招く可能性があるため、C++はこのような状況をよりよく処理するためにネーミング空間の概念を提案し、ネーミング空間はグローバル役割ドメイン(グローバル運用ドメインもデフォルトネーミング空間と呼ぶ)を異なる部分に分け、これにより、異なるネーミングスペース部分の識別子が重複しても競合しません.
	int x = 1;//         
	
	namespace Name1
	{
		int i = 0;
		
		namespace Name2
		{
			...
			...
			int j = 1;
		
		}
		
		...
		...
		int k = 1;
	
	}

ネーミングスペースの定義は比較的簡単であり、定義をネストすることもできます.
ネームスペース全体を使用:
using namespace Name1; 
 i = 3;//先に説明してから使う
k = 5; 
ネーミングスペースの変数を使用するには、次の手順に従います.
using Name1::i;  i = 3;//先に説明してから使う  
using Name1::Name2::j;  j = 2;//先に説明してから使う
Name1::i = 4;//直接使用
デフォルトのネーミングスペースの変数を使用します.
 ::x;