關(guān)鍵詞: new
和delete
關(guān)鍵字馋贤、new
與malloc
的區(qū)別、 命名空間
1. 動(dòng)態(tài)內(nèi)存分配
C語(yǔ)言中是通過(guò)malloc
庫(kù)函數(shù)來(lái)實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配询筏,C++通過(guò)new
關(guān)鍵字進(jìn)行動(dòng)態(tài)內(nèi)存分配泻肯。
- C++中的動(dòng)態(tài)內(nèi)存分配
- C++ 中通過(guò)
new
關(guān)鍵字進(jìn)行動(dòng)態(tài)內(nèi)存申請(qǐng) - C++中動(dòng)態(tài)內(nèi)存申請(qǐng)是基于類型進(jìn)行的
-
delete
關(guān)鍵字用于內(nèi)存釋放
- C++ 中通過(guò)
//變量申請(qǐng):
Type* pointer = new Type;
// ......
delete pointer;
// 數(shù)組申請(qǐng):
Type* pointer = new Type[N];
// ......
delete[] pointer;
編程說(shuō)明:C++中的動(dòng)態(tài)內(nèi)存分配
#include <stdio.h>
int main()
{
int* p = new int;
*p = 5;
*p = *p + 10;
printf("p = %p\n", p);
printf("*p = %d\n", *p);
delete p;
p = new int[10];
for(int i=0; i<10; i++)
{
p[i] = i + 1;
printf("p[%d] = %d\n", i, p[i]);
}
delete[] p;
return 0;
}
輸出結(jié)果:
p = 0x9d72008
*p = 15
p[0] = 1
p[1] = 2
p[2] = 3
p[3] = 4
p[4] = 5
p[5] = 6
p[6] = 7
p[7] = 8
p[8] = 9
p[9] = 10
2. new
關(guān)鍵字與malloc
函數(shù)的區(qū)別
-
new
關(guān)鍵字是C++的一部分 -
malloc
是由C庫(kù)提供的函數(shù) -
new
以具體類型為單位進(jìn)行內(nèi)存分配 -
malloc
以字節(jié)為單位進(jìn)行內(nèi)存分配 -
new
在申請(qǐng)單個(gè)類型變量時(shí)可以進(jìn)行初始化 -
malloc
不具備內(nèi)存初始化的特性
3. new關(guān)鍵的初始化
#include <stdio.h>
int main()
{
int* pi = new int(1);
float* pf = new float(2.0f);
char* pc = new char('c');
printf("*pi = %d\n", *pi);
printf("*pf = %f\n", *pf);
printf("*pc = %c\n", *pc);
delete pi;
delete pf;
delete pc;
return 0;
}
輸出結(jié)果:
*pi = 1
*pf = 2.000000
*pc = c
4. C++中的命名空間
- 在C語(yǔ)言中只有一個(gè)全局作用域
- C語(yǔ)言中所有的全局標(biāo)識(shí)符共享同一個(gè)作用域
- 標(biāo)識(shí)符之間可能發(fā)生沖突
- 在C++中提出了命名空間的概念
- 命名空間將全局作用域分為不同的部分
- 不同命名空間中的標(biāo)識(shí)符可以同名而不會(huì)發(fā)生沖突
- 命名空間可以相互嵌套
- 全局作用域也叫默認(rèn)命名空間
//命名空間的定義
namespace Name
{
namespace Internal
{
/* ...*/
}
/* ...*/
}
- C++命名空間的使用:
- 使用整個(gè)命名空間:
using namespace name
; - 使用命名空間中的變量:
using name::variable
; - 使用默認(rèn)命名空間中的變量:
::variable
;
編程說(shuō)明:命名空間的使用
- 使用整個(gè)命名空間:
#include <stdio.h>
namespace first
{
int i = 0;
}
namespace second
{
int i = 1;
namespace Internal
{
struct P
{
int a;
int b;
};
}
}
int main(int argc, char* argv[])
{
using namespace first;
using second::Internal::P;
P p = {2, 3};
printf("%d\n", i);
printf("%d\n", second::i);
printf("%d\n", p.a);
printf("%d\n", p.b);
return 0;
}
輸出結(jié)果:
0
1
2
3
5. 小結(jié)
- C++中內(nèi)置了動(dòng)態(tài)內(nèi)存分配的專用關(guān)鍵字——
new
和delete
- C++中的動(dòng)態(tài)內(nèi)存分配可以同時(shí)進(jìn)行初始化
- C++中的動(dòng)態(tài)內(nèi)存分配是基于類型進(jìn)行的
- C++中命名空間概念用于解決名稱沖突問(wèn)題
聲明:此文章僅是本人在學(xué)習(xí)狄泰學(xué)院《C++深度解析教程》所做的筆記佳励,文章中包含狄泰軟件資料內(nèi)容,一切版權(quán)歸狄泰軟件所有富腊!
實(shí)驗(yàn)環(huán)境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)