C++中的动态内存分配
C语言是通过库函数来完成动态内存分配的,而C++是通过关键字从语言层面支持的。
C语言中的malloc是基于字节来进行内存申请的,C++中是基于类型来进行的。
delete加上[]代表释放数组,如果不加的话只会释放第一个元素的内存空间。
示例程序如下:
#include <stdio.h> int main()
{
int* p = new int; *p = ;
*p = *p + ; printf("p = %p\n", p);
printf("*p = %d\n", *p); delete p; p = new int[]; for(int i=; i<; i++)
{
p[i] = i + ; printf("p[%d] = %d\n", i, p[i]);
} delete[] p; return ;
}
运行结果如下:
new和delete在使用体验上比malloc和free好,malloc和new的区别如下:
new关键字的初始化:
示例程序如下:
#include <stdio.h> int main()
{
int* pi = new int();
// 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 ;
}
运行结果如下:
new int(1)和new int[1]是不同的,一个是申请内存并初始化,一个是申请有一个元素的数组。
C++中的命名空间:
C++中命名空间的定义:
C++命名空间的使用:
示例程序:
#include <stdio.h> namespace First
{
int i = ;
} namespace Second
{
int i = ; namespace Internal
{
struct P
{
int x;
int y;
};
}
} int main()
{
using namespace First;
using Second::Internal::P; printf("First::i = %d\n", i);
printf("Second::i = %d\n", Second::i); P p = {, }; printf("p.x = %d\n", p.x);
printf("p.y = %d\n", p.y); return ;
}
运行结果如下:
小结:
C++中内置了动态内存分配的专用关键字
C++中的动态内存分配可以同时进行初始化
C++中的动态内存分配是基于类型进行的
C++中命名空间概念用于解决名称冲突问题