C++ 中的动态内存分配:
C++与C语言分配内存关键字不同,C语言中的动态内存分配是通过 malloc(分配内存) 与 free(释放内存)完成。C++使用new(分配内存) delete(释放内存)。
C++与C语言分配内存方式不同,C语言是以字节进行内存分配,C++是以类型进行内存分配。
C++申请内存方法:
变量申请内存: type *name = new type; delete name; 数组申请内存: type *name = new type[N]; delete[] name;
带初始化的内存分配:
type *name = new type(val);//val 初始值
C语言申请内存方法:
int *p; p = (int *)malloc(sizeof(int)*N); free(p);
实验代码:
#include <stdio.h> int main(int argc, char *argv[]) { int *pi = new int(100); char *Pc = new char('c'); int *p = new int[10]; printf("Begin... "); printf("*pi = %d ",*pi); printf("*pc = %c ",*Pc); for(int i = 0;i<10 ; i++) { p[i] = i; printf("p[%d] = %d ",i,p[i]); } printf("End... "); delete pi; delete Pc; delete[] p; return 0; }
new关键字与malloc函数的区别:
new 是C++的一部分,malloc是由C库提供的
new是以具体类型为单位进行内存分配,malloc是以字节为单位进行内存分配。
new在申请单个类型变量的时候可以进行初始化,malloc不具备这种特性。
C++ 的命名空间 namespace:
在C语言中只有一个全局作用域,这样可能发生标识符之间的冲突。
C++可以将全局作用域分成不同的部分,不同命名空间的标识符可以同名不会发生冲突。命名空间可以嵌套。全局作用域也叫作默认的命名空间。
C++ 命名空间定义: namespace { namespace { /**/ } /**/ }
测试代码:
#include <stdio.h> int main(int argc, char *argv[]) { int *pi = new int(100); char *Pc = new char('c'); int *p = new int[10]; printf("Begin... "); printf("*pi = %d ",*pi); printf("*pc = %c ",*Pc); for(int i = 0;i<10 ; i++) { p[i] = i; printf("p[%d] = %d ",i,p[i]); } printf("End... "); delete pi; delete Pc; delete[] p; return 0; } #include <stdio.h> namespace Frist { int i = 1; } namespace seconde { int i=10; namespace thirdly { struct p { int x; int y; }; } } int main(int argc, char *argv[]) { using namespace Frist; //使用 Frist整个命名空间 using seconde::thirdly::p;//使用seconde 命名空间中的 thirdly命名空间中的 结构体p printf("Begin... "); printf("Frist::i = %d ",i);//直接使用 Frist 中的变量i printf("seconde::i = %d ",seconde::i);//使用seconde命名空间中的变量i 注意如果同时使用Frist 与seconde整个命名空间就不能直接使用变量i p thirdly_p ={1,2};//初始化 seconde 命名空间中的 thirdly命名空间中的 结构体p printf("p.x = %d ",thirdly_p.x);//直接使用 thirdly_p.x printf("p.y = %d ",thirdly_p.y); printf("End... "); return 0; }
运行结果:
Begin... Frist::i = 1 seconde::i = 10 p.x = 1 p.y = 2 End...