1、C++中的動態記憶體分配
- 通過
new
關鍵字進行動態記憶體申請 - C++中的動態記憶體申請時基於型別進行的
-
delete
關鍵用於記憶體釋放C語言其實是不支援動態記憶體分配的,是通過
malloc
庫函式來實現的,可能有一些硬體根本不支援malloc
;而C++new
是一個關鍵字,不管在任意編譯器上,任意硬體平臺上都是能夠進行動態記憶體分配的,這是本質區別。
malloc
是基於位元組來進行動態記憶體分配的,new
則是基於型別來進行動態記憶體分配
// 變數申請:
Type * pointer = new Type; // 從堆空間獲取一個新的Type型別的空間
// 使用和C語言一樣
delete pointer; // 這裡指的是pointer所指向的那個元素的記憶體空間被釋放
// 陣列申請:
Type * pointer = new Type[N]; // N指陣列大小,陣列元素個數,並非位元組數
//
delete[] pointer; // 陣列的釋放,需要在delete後面加[],和變數有區別
// delete[] 說明所要釋放的指標是指向一片陣列空間的,釋放整個陣列空間,如果用delete的話,pointer指向的是陣列的首元素地址,釋放的就是首元素的記憶體空間,其餘元素的記憶體空間並沒有釋放,會造成記憶體洩漏
#include <stdio.h>
int main()
{
int* p = new int;
*p = 5;
*p = *p + 10;
printf("p = %p
", p);
printf("*p = %d
", *p);
delete p; // 指釋放單個變數
p = new int[10]; // p指向一片陣列空間,
// p所指向的記憶體空間,至少佔用了40個位元組,保證夠用,可能分配得更多
for(int i=0; i<10; i++)
{
p[i] = i + 1;
printf("p[%d] = %d
", i, p[i]);
}
delete[] p; // 釋放陣列
return 0;
}
new
關鍵字與malloc
函式的區別:
-
new
關鍵字是C++的一部分 -
malloc
是由C庫提供的函式 -
new
以具體的型別為單位進行記憶體分配 -
malloc
以位元組為單位進行記憶體分配 -
new
在申請單個型別變數時可以進行初始化 -
malloc
不具備記憶體初始化的特性
new
關鍵字的初始化:
int* pi = new int(1);
float* pf = new float(2.0f);
char* pc = new char(`c`)l
2、C++中的名稱空間
在C語言中只有一個全域性作用域
- C語言所有的全域性識別符號共享同一個作用域
- 識別符號之間可能發生衝突
C++中提出了名稱空間的概念
- 名稱空間將全域性作用域分成不同的部分
- 不同名稱空間中的識別符號可以同名而不會發生衝突
- 名稱空間可以相互巢狀
- 全域性作用域也叫預設名稱空間
定義:
namespace Name
{
namespace Internal
{
/* ... */
}
/* ... */
}
名稱空間的使用
using namespace name; // 使用整個名稱空間
using name::variable; // 使用名稱空間中的變數
::variable; // 使用預設名稱空間中的變數
#include <stdio.h>
namespace First
{
int i = 0;
}
namespace Second
{
int i = 1;
namespace Internal
{
struct P
{
int x;
int y;
};
}
}
int main()
{
using namespace First;
using Second::Internal::P;
printf("First::i = %d
", i);
printf("Second::i = %d
", Second::i);
P p = {2, 3};
printf("p.x = %d
", p.x);
printf("p.y = %d
", p.y);
return 0;
}
名稱空間解決了全域性變數命名衝突的問題
3、小結
C++ 中內建了動態記憶體分配的專用關鍵字
C++ 中的動態記憶體分配可以同時進行初始化
C++ 中的動態記憶體分配時基於型別進行的
C++ 中名稱空間概念用於解決名稱衝突問題