范围 for,new 内存动态分配,nullptr
范围 for
int main()
{
int arr[] = {11, 12, 13, 14, 15};
for (auto x : arr){ // 问题所在:需要将 arr 中的每一个都拷贝到 x 中去 ===> 节省拷贝的方法:使用指针,提升效率
cout << x << endl;
}
cout << "===============================" << endl;
// 改进
for (auto &x : arr){ // 省了拷贝这个动作,提高了系统效率
cout << x << endl;
}
return 0;
}
new 内存动态分配
C中 供程序使用的存储空间:程序区,静态存储区,动态存储区
C++ 中,我们把区域进一步分为5个区域:
- 栈:一般函数内的局部变量都会放在这里,由编译器自动分配和释放
- 堆:程序员 malloc / new 分配,用 free /delete 来释放。忘记释放后,系统会回收
- 全局/静态存储区:放全局变量和静态变量 static。程序结束时系统释放
- 常量存储区:"I Love China"
- 程序代码区
堆和栈的区别:
- 栈:空间是有限的,这是系统 int a = 4; 分配速度快,程序员控制不了
- 堆:只要不超出你实际的物理内存,也在操作系统允许你能够分配的最大内存大小 之内,都可以分配给你,分配速度1比栈慢,你可以随时使用 new / malloc 来分配,free / delete 来释放,非常灵活。
malloc 和 free:在 C 语言中,用 malloc 和 free 从堆中来分配和释放内存用。malloc 和 free 是函数
// 返回类型是:void * ===> 万能的类型指针(指向什么东西都行,可以被强制转换成任何其它类型指针)
// - 分配成功:返回指向被分配内存的指针
// - 分配失败:则返回 NULL
void *malloc(int NumBytes); // NumBytes:要分配的字节数
// 当这段分配的内存你不使用的时候,你应该用 free() 函数来将内存释放掉,供其它地方使用
void free(void *FirstByte);
C 语言例子
int main()
{
int *p = NULL;
p = (int *)malloc(sizeof(int)); // 在堆中分配 4个字节
if (p != NULL) {
// 分配成功
*p = 5;
cout << *p << endl;
free(p); // 释放掉,千万不要忘记
}
char *point = NULL;
point = (char *)malloc(100 * sizeof(char)); // 100个位置
if (point) {
strcpy(point, "hello world!!!");
cout << point << endl;
}
return 0;
}
再看见 C++ 的 new 和 delete