c++内存管理(上)

目录

引入

分析

说明

C语言中动态内存管理方式

C++内存管理方式

new/delete操作内置类型

new和delete操作自定义类型


引入

我们先来看下面的一段代码和相关问题
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";
const char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}
1. 选择题:
选项 : A . B . C . 数据段 ( 静态区 ) D . 代码段 ( 常量区 )
globalVar 在哪里? ____ staticGlobalVar 在哪里? ____
staticVar 在哪里? ____ localVar 在哪里? ____
num1 在哪里? ____
char2 在哪里? ____ * char2 在哪里? ___
pChar3 在哪里? ____ * pChar3 在哪里? ____
ptr1 在哪里? ____ * ptr1 在哪里? ____
2. 填空题:
sizeof ( num1 ) = ____ ;
sizeof ( char2 ) = ____ ; strlen ( char2 ) = ____ ;
sizeof ( pChar3 ) = ____ ; strlen ( pChar3 ) = ____ ;
sizeof ( ptr1 ) = ____ ;
3. sizeof strlen 区别?

分析

全局变量与static变量均在静态区(static变量在第一次载入时初始化)

字符串均在常量区,如果是采用数组方式,那么就是从常量区将字符串拷贝到栈区中,因此对字符串数组存储在栈中,而下面的字符串指针指向字符串所存储的位置,字符串本身存储在常量区中

注意:const char* ptr="abcd",*ptr在常量区,因为*ptr无法被修改,因此会直接将常量区的位置传递给指针

各种变量,包括int char 指针类型变量都存储在栈中

sizeof如果是整个数组则返回数组大小,如果是其他类型变量则返回变量大小

strlen返回的是字符串长度从第一个元素到'\0'之前的元素个数

说明

1. 又叫堆栈 -- 非静态局部变量 / 函数参数 / 返回值等等,栈是向下增长的。
2. 内存映射段 是高效的 I/O 映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共 享内存,做进程间通信。(linux部分会讲)
3. 用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段 -- 存储全局数据和静态数据。
5. 代码段 -- 可执行的代码 / 只读常量。

C语言中动态内存管理方式

malloc/calloc/realloc/free
void Test ()
{
int* p1 = (int*) malloc(sizeof(int));
free(p1);
// 1.malloc/calloc/realloc的区别是什么?
int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);
// 这里需要free(p2)吗?
free(p3 );
}

C++内存管理方式

C 语言内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此 C++ 又提 出了自己的内存管理方式:通过 new delete 操作符进行动态内存管理

new/delete操作内置类型

void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[10];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

注意:申请和释放单个元素的空间,使用 new delete 操作符,申请和释放连续的空间,使用 new[] delete[] ,注意:匹配起来使用。

newdelete操作自定义类型

class A
{
public:
A(int a = 0)
: _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构
造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
// 内置类型是几乎是一样的
int* p3 = (int*)malloc(sizeof(int)); // C
free(p3);
delete p4;
A* p5 = (A*)malloc(sizeof(A)*10);
A* p6 = new A[10];
free(p5);
delete[] p6;
return 0;
}
注意:在申请自定义类型的空间时, new 会调用构造函数, delete 会调用析构函数,而 malloc free 不会

相关推荐

  1. C/C++——内存管理

    2024-07-10 00:56:05       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 00:56:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 00:56:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 00:56:05       58 阅读
  4. Python语言-面向对象

    2024-07-10 00:56:05       69 阅读

热门阅读

  1. 决策树构建精要:算法步骤与实现细节

    2024-07-10 00:56:05       22 阅读
  2. 我们为什么要学数据库?

    2024-07-10 00:56:05       20 阅读
  3. redis的setnx实现分布式锁

    2024-07-10 00:56:05       30 阅读
  4. Bert 变种, T5模型

    2024-07-10 00:56:05       21 阅读
  5. Docker实战教程(一)

    2024-07-10 00:56:05       24 阅读
  6. Visual Studio编译优化选项

    2024-07-10 00:56:05       19 阅读
  7. Pywinauto:强大的Windows 应用程序测试工具

    2024-07-10 00:56:05       23 阅读
  8. Linux grep技巧 结合awk查询

    2024-07-10 00:56:05       16 阅读
  9. Appium:强大的移动应用测试工具

    2024-07-10 00:56:05       21 阅读
  10. 宝塔-Linux模板常用命令-centos7

    2024-07-10 00:56:05       21 阅读