给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)
当然也会看到别的定义如:
两者都正确,记那个都选,我选择的是第一个。
再比如还有这样的分组: 这种分组是最正确的
开始我们先做一个题:
include
using namespace std;
int globalVar = 1;
static int staticGlobalVar = 1;
void test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1,2,3,4,5,6,7,8,9,10 };
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);
}
int main()
{
test();
return 0;
}
前五个空就不在解释了,直接从第六个空开始解释
你知道malloc,calloc,realloc的三者区别么?
你知道malloc的实现原理么?
推荐视频:【CTF】GLibc堆利用入门-机制介绍_哔哩哔哩_bilibili
new/delete
在c语言种我们在堆上开辟空间通常使用malloc,calloc,realloc。但在c++中是通过new出来对象。
所以就有一个笑话:你没有对象么?没有那我们就new一个出来。
这里我们先展示一下简单运用;
include
int main()
{
//动态开辟一个int类型的对象
int p1 = new int;
//动态开辟一个int类型的空间并初始化为10
int p2 = new int(10);
//动态申请10个int类型的空间
int* p3 = new int[10];
//在c语言中我们动态开辟后又free,同样在c++中也有操作符delete
delete p1;
delete p2;
delete []p3;//注意数组的要加[]
return 0;
}
可见,new与c语言的malloc,calloc,realloc使用起来都差不多,
include
using namespace std;
class A
{
public:
A(int a = 0)
: _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构
//造函数和析构函数
A a1 = new A(2);
A a2 = (A*)malloc(sizeof(A));
free(a2);
delete a1;
return 0;
}
这是我们从直观观察到的差别,其实new与malloc还是又很大的差别的。
这一点我也不是特别懂,我就把我明确知道并且正确的说一下吧。然后提供更好的文章。
new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局 函数来释放空间。
优秀文章:
C++ 涨知识!new和delete知识总结(全面详细)_c++ new-CSDN博客
在最后补充一个细节: