05_C++ 动态内存分配 & 命名空间
1.new & delete
C中申请内存使用库函数malloc
free
申请的是字节的大小,通常呢系统分配能够分配成功返回,但是我们也需要判断是否功能,由于我们不知道该内存之前是什么数据,通过我们还需要强制清零。以防止后续使用时,数据异常。
C++中申请动态内存是关键词 new
是基于类型申请的。 使用delete
释放,可以再申请的时候初始化内存空间,无需后续处理。
变量申请:
类型 *pointer = new 类型;
delete pointer
数组申请:
类型 * pointer= new 类型[N];
delete []pointer;
#include <stdio.h>
int main()
{
int* p = new int;
*p = 5;
*p = *p + 10;
printf("p = %p\n", p); //5
printf("*p = %d\n", *p);//15
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;
}
#include <stdio.h>
int main()
{
int* pi = new int(1);
// int* pa = 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;
}
2.命名空间namespace
C 语言中全部变量作用域只有一个,容易重名,这样不利于多人合作开发;
C++ 增加了namespace
概念使得全局作用域只在作用域中有效;并且支持嵌套使用;
声明:
namespace {
}
使用方式:
- 使用整个命名空间:
using namespace XXX
; - 使用命名空间的变量:
using xxx::abc
; - 使用默认命名空间:
::abc
;
#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\n", i);//0
printf("Second::i = %d\n", Second::i);//1
P p = {2, 3};
printf("p.x = %d\n", p.x);//2
printf("p.y = %d\n", p.y);//3
return 0;
}