cとc++ダイナミックメモリ開発&newnamespace

3726 ワード

cで動的にメモリ領域を開く:
malloc関数プロトタイプvoid*malloc(size_t size);  size_t-----符号なしオペレーティングシステム----カーネル駆動----ハードウェア
void*は半開半閉区間で、ダイナミックメモリの開始アドレスしか知らないが、いつ終わるか分からない.
void free(void*ptr)/freeはfreeの空間サイズを指定する必要がなく、free()の場合はカーネルに格納されているヘッダアドレスと比較し、一致すればアドレスが合法であることを証明し、解放することができる.
int*p=(int*)malloc(1)は1バイトのアドレス空間を強制的にintに変換し、実際には1バイトの空間しかなく、使用時に限界を招く
C++動的にメモリ領域を開く:
メモリ用newキーワードを開き、メモリ用Deleteを解放する
int*p=new int//スペースサイズを指定する必要はなく、コンパイラによってサイズが制御されます
                                  int *p=new int(10);//pは値10のint数を指す
                                  int *p = new int[10];//動的整数配列を申請します.配列の長さは[]の値です.
int main()
{
	int* p = new int(10);//p      10       
	delete p;

	int*cp = (int*)malloc(sizeof(int)* 10);//malloc         ,             
	free(cp);//  



	int* cppp = new int[10](0);//new          ,   0   
	delete[] cppp;//  




	//int arr[10][10];//int*   int(*)[10]
	int**parr = (int**)malloc(sizeof(int*)* 10);//malloc          
	for (int i = 0; i < 10; i++)
	{
		parr[i] = (int*)malloc(sizeof(int)* 10);
	}
        for (int i = 0; i < 10; i++)//  
	{
		free(parr[i]);
	}
	free(parr);



	int** cpparr = new int*[10];//new        
	for (int i = 0; i < 10; i++)
	{
		cpparr[i] = new int[10];
	}


	for (int i = 0; i < 10; i++)//  
	{
		delete[] cpparr[i];
	}
	delete[] cpparr;




	double* pd = new double(10);
	delete[] pd;




	const int* cp1 = new const int(10);//            ,            
	//const int* cparr = new const int[10](0);//          ,   0
	delete cp1;

义齿
int main()
{
    int *q= new int;
    char *q=new(q)char('a');//    4          1     'a'
    return 0;
}//     q    P    

新開発のメモリ領域をフリーストレージ領域と呼ぶ
new/malloc new:フリーストレージ領域1、newフリーストレージ領域で開くmallocスタック上で開く2、new戻りタイプセキュリティ(必要なメモリを直接処理する)malloc戻りタイプセキュリティ3、newメモリオープンのサイズを計算する必要がないmallocメモリオープンのサイズを計算する必要がある4、new放出異常(bad_alloc)mallocはNULL 5を返し、newはmallocを初期化して単純にメモリを開くことができる
 
グローバル役割ドメインローカル役割ドメイン名前空間役割ドメイン同名:クラス役割のマージ
#include
#include  // std
using namespace std;
namespace CY1207
{
	int a = 10;
	int Sum(int a, int b)
	{
		std::cout << "namespace CY1207" << std::endl;
		return a + b;
	}
}

int Sum(int a, int b)
{
	cout << "global" << endl;
	return a + b;
}
int main()
{

	Sum(10, 20);//         
	
	return 0;
}
namespace CY1207
{
	int a = 10;
	int Sum(int a, int b)
	{
		std::cout << "namespace CY1207" << std::endl;
		return a + b;
	}
}
int main()
{
	using CY1207::Sum;//using              using        
	//using namespace CY1207;//using                         using          
	Sum(10, 20);
	//int b = a;
	return 0;
}
namespace CY1207
{
	int a = 10;
	int Sum(int a, int b)
	{
		std::cout << "namespace CY1207" << std::endl;
		return a + b;
	}
}

int main()
{
	//using CY1207::Sum;//using              using        
	using namespace CY1207;//using                         using          
	Sum(10, 20);
	int b = a;
	return 0;
}
#include//      
#include  // std
using namespace std;
namespace CY1207
{
	int a = 10;
	int Sum(int a, int b)
	{
		std::cout << "namespace CY1207" << std::endl;
		return a + b;
	}
}
namespace CY1207
{
	int a = 10;
	int b = 10;
}
//int Sum(int a, int b)
//{
//	cout << "global" << endl;
//	return a + b;
//}
int main()
{
	//using CY1207::Sum;//using              using        
	using namespace CY1207;//using                         using          
	Sum(10, 20);
	int b = a;
	return 0;
}