C/C++内存管理

c 复制代码
	int* p2 = (int*)malloc(sizeof(int));
	
	int* p3 = new int;

c++ 兼容 c 语言 对内置类型的动态申请,用法简化了,功能保持一致

单个对象用 new 多个对象用 new[元素个数]

c 复制代码
	int* p3 = new int;
	int* p5 = new int[10];

不用了的话就c语言是free ,c++ 是delete

单个对象:delete + 对象名

多个对象:delete[] + 对象名

c++ 额外支持开空间+初始化的功能
int* p6 = new int(1);
int* p7 = new int[10]{1, 2, 3};


new 可以调用默认构造函数,但是malloc却不行
delete 可以调用析构函数,但是free 不行,

所以这就是为什么c++ 要创建 new 和 delete 。
但是需要注意的是:自定义类型才会调用构造和析构函数, 内置类型是不会调用的。

operator new与operator delete函数

注意:operator new与operator delete 并不是new和delete的重载,

它两(operator new与operator delete ) 就是库里的函数

看下面代码:

c 复制代码
int main()
{
	try
	{
		char* p1 = new char[0x7fffffff];
	}
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}

	return 0;
}

结果:

理解:
new可以理解为operator new构造函数的合体。在用new的时候,可以理解为编译器先调用operatpor new,然后再调用构造函数。这样就完成了开空间初始化。其中operator new负责开空间,构造函数负责初始化。
operator new其实就是对malloc函数的改编。

malloc函数开空间失败是返回的错误值。

operator new开空间失败是抛异常。

malloc/free 和 new/delete 的区别:

思考下面的问题:

c 复制代码
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在哪里?

  1. 填空题:
    sizeof(num1) = ____;
    sizeof(char2) = ____;
    strlen(char2) = ____;
    sizeof(pChar3) = ____;
    strlen(pChar3) = ____;
    sizeof(ptr1)= ____;

解答:

  1. 选择题:
    选项:
    A.
    B.
    C.数据段(静态区)
    D.代码段(常量区)

globalVar在哪里?____

全局变量是放在静态区的。

staticGlobalVar在哪里?____

静态变量也是放在静态区的。

staticVar在哪里?____

静态变量也是放在静态区的。

localVar在哪里?____

局部变量是在的栈中

num1 在哪里?____

局部的数组也是在栈中。

char2在哪里?____

局部的数组也是在栈中。

*char2在哪里?___

char2是数组名,数组名代表的是首元素的地址,*char2就是对这个地址解引用。

char2 是在栈中的。*char2就是对char2的首元素的地址解引用,拿到的就是首元素,所以也在栈中。

pChar3在哪里?____

Pchar3 是一个指针变量,是在栈上的。

*pChar3在哪里?____

Pchar3 是一个指针变量,是在栈上的。

但是Pchar3 所指向的内容是在常量区的

(因为常量字符串:"abcd" 是在常量区的。)

所以*Pchar3就是拿到常量区的内容。所以是在常量区上的。

ptr1在哪里?____

ptr1也是个指针,这个指针是一个局部变量。 所以它在栈中

*ptr1在哪里?____

*ptr1 拿到的是ptr1指向的内容。他指向的内容是在堆区中的是malloc申请的。所以是在堆区中的。

  1. 填空题:
    sizeof(num1) = ____;

num1是数组名。sizeof数组名计算的是整个数组的大小。所以是4×10=40。

sizeof(char2) = ____;

char2是数组名,sizeof数组名计算的是整个数组的大小,但是字符数组它后面会跟一个/0,所以说这里是5个字节

strlen(char2) = ____;

strlen是遇到/0终止,所以说这里是4

sizeof(pChar3) = ____;

sizeof一个指针变量,指针变量的大小是固定的,在32位下是4,在64位下是8。

strlen(pChar3) = ____;

sizeof一个指针变量,指针变量的大小是固定的,在32位下是4,在64位下是8。

sizeof(ptr1)= ____;

strlen是遇到/0终止,所以说这里是4

相关推荐
乄夜37 分钟前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
乖乖是干饭王3 小时前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
weixin_478689763 小时前
C++ 对 C 的兼容性
java·c语言·c++
待什么青丝4 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小柯博客4 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网
CodeWithMe5 小时前
【C/C++】namespace + macro混用场景
c语言·开发语言·c++
SY师弟8 小时前
台湾TEMI协会竞赛——0、竞赛介绍及开发板介绍
c语言·单片机·嵌入式硬件·嵌入式·台湾temi协会
HUN金克斯8 小时前
C++/C函数
c语言·开发语言·c++
慢半拍iii8 小时前
数据结构——F/图
c语言·开发语言·数据结构·c++
m0_637146938 小时前
零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!
c语言·开发语言·链表