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);
}
- 选择题:
选项:
A.
栈
B.
堆
C.
数据段(静态区)
D.
代码段(常量区)
globalVar
在哪里?____ staticGlobalVa
r在哪里?____
staticVar
在哪里?____ localVar
在哪里?____
num1
在哪里?____
char2
在哪里?____ *char2
在哪里?___
pChar3
在哪里?*pChar3
在哪里?
ptr1
在哪里? *ptr1
在哪里?
- 填空题:
sizeof(num1)
= ____;
sizeof(char2)
= ____;
strlen(char2)
= ____;
sizeof(pChar3)
= ____;
strlen(pChar3)
= ____;
sizeof(ptr1)
= ____;
解答:
- 选择题:
选项:
A.
栈
B.
堆
C.
数据段(静态区)
D.
代码段(常量区)
globalVar
在哪里?____
全局变量是放在静态区的。
staticGlobalVa
r在哪里?____
静态变量也是放在静态区的。
staticVar
在哪里?____
静态变量也是放在静态区的。
localVar
在哪里?____
局部变量是在的栈中
num1
在哪里?____
局部的数组也是在栈中。
char2
在哪里?____
局部的数组也是在栈中。
*char2
在哪里?___
char2是数组名,数组名代表的是首元素的地址,*char2就是对这个地址解引用。
char2 是在栈中的。*char2就是对char2的首元素的地址解引用,拿到的就是首元素,所以也在栈中。
pChar3
在哪里?____
Pchar3 是一个指针变量,是在栈上的。
*pChar3
在哪里?____
Pchar3 是一个指针变量,是在栈上的。
但是Pchar3 所指向的内容是在常量区的
(因为常量字符串:"abcd" 是在常量区的。)
所以*Pchar3就是拿到常量区的内容。所以是在常量区上的。
ptr1
在哪里?____
ptr1也是个指针,这个指针是一个局部变量。 所以它在栈中
*ptr1
在哪里?____
*ptr1 拿到的是ptr1指向的内容。他指向的内容是在堆区中的是malloc申请的。所以是在堆区中的。
- 填空题:
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