C++:new/delete、namespace
一、new/delete(動態開闢/釋放)
在C語言中我們使用malloc動態開闢,free釋放
在C++中我們使用關鍵字 "new"動態開闢,delete釋放
1.定義:
動態開闢:new + 型別
變數:int *p=new int(10);
陣列:int *p=new int[10]; // [陣列長度]
釋放:delete + 指標
變數:delete p;
釋放:delete[] p;
//C語言malloc動態開闢、free釋放 int* p1 = (int*)malloc(sizeof(int)* 10); if (p1 == NULL) { cout << "error: no memory!" << endl; } free(p1); //C++new動態開闢,delete釋放 int* p2 = new int[10];//建立一個int型別陣列且長度為10 delete[] p2;//陣列釋放 int* p3 = new int(10);//建立一個int型別變數且初始化值為10 cout << *p3 << endl; delete p3;//變數釋放
一般不予許建立一個有限陣列並具體初始化為某個值(大於0),例如:建立並初始化一個長度為10,值為5的整型陣列
//特例
int* p4 = new int[10]();//建立一個int型別且長度為10的陣列並全部初始化為0
delete[] p4;
2.new和malloc區別
new | malloc | |
開闢空間的位置 | 自主儲存區 | 堆 |
屬性 |
關鍵字 |
函式 |
初始化 | 邊開闢初始化 | 只開闢記憶體 |
若記憶體不足 開闢失敗 |
丟擲異常 ,不會為NULL | 返回NULL |
是否可以開闢常量記憶體塊 | 可以 | 不可以 |
注:開闢常量記憶體塊,需要初始化:const int * p=new const int(10);
delete p;
且一般不會開闢常量陣列,無意義
3.動態開闢和釋放二維陣列
//malloc
int** p7 = (int**)malloc(sizeof(int*)* 10);
for (int i = 0; i < 10; i++)
{
p7[i] = (int*)malloc(sizeof(int)* 10);
}
for (int i = 0; i < 10; i++)
{
free(p7[i]);
}
free(p7);
//new
int** p8 = new int*[10];
for (int i = 0; i < 10; i++)
{
p8[i] = new int[10];
}
for (int i = 0; i < 10; i++)
{
delete[] p8[i];
}
delete[] p8;
4.重定義:
int a;
char *p=new (&) char 'a';
首先在棧上開闢四個位元組大小的空間,然後建立一個指標指向new開闢使用一個位元組存放‘a’為自定義區域(紅色部分),而剩下三個位元組空間依舊在棧上(藍色部分)
二、namespace名字空間作用域:防止名字衝突
在C語言中,作用域有:全域性作用域、區域性作用域、
在C++中,作用域有:全域性作用域、區域性作用域、名字空間作用域、類作用域
1.namespace + 作用域
使用方法: ::全域性作用域訪問符
namespca ::名字空間作用域訪問符
類 ::類作用域訪問符
2.using宣告: using +名字空間名+ :: +名字空間作用域的一個變數//一次只暴露一個變數
using指示符: using +namespcae+名字空間名//一次只暴露所有變數
namespace wh
{
int a = 11;
int Sum(int a, int b)
{
return a + b;
}
}
namespace wh
{
int a = 20;
}
int main()
{
using wh::a;//using宣告
using namespace wh;//using指示符
int b = a;
int rt = Sum(10, 20);
cout << b << endl;//名字空間同名,合併,a重定義,編譯出錯
return 0;
}
注:若名字空間作用域同名,則會合並