动态内存管理
c和c++动态管理联系与差异:(malloc free 和new delete联系和区别)
1.他们是用来动态开辟空间的。
2.malloc开辟的空间没有初始化,不是对象,而new出来的是对象,先调用malloc开辟空间,再调用调用了构造函数初始化这片空间。free释放了这片空间,而delete则先是调用析构函数,在调用free进行释放空间。
3.malloc和free是c语言所用的函数,而new和delete是c++的操作符。
c语言用
malloc calloc realloc/free进行内存管理
malloc:向堆申请一块空间,并且返回一个void类型的指针,这时我们需要将这个指针进行强转为我们需要的类型。
calloc: 和malloc一样都是申请一块空间,有所不同的是,它可以指定一次分配多少块这样大小的空间。
realloc:在原来有的空间上进行追加的分配,也就是当你现在的空间不够使用了,需要保留原来的数据,但同时需要多一点的空间来存放新的内容时。
下面是我用图来进行对realloc进行说明:
![](https://i-blog.csdnimg.cn/blog_migrate/ebc8947d2d0f91f587850c354d2ab9d8.png)
c++的动态分配:
c++用new,detele来进行动态分配的。
下面我们看下new delete是怎么开辟空间的:
![](https://i-blog.csdnimg.cn/blog_migrate/c5653b49c827e1ba19a451f8febfceb1.png)
下面我们通过调试我们看一下它们工作过程:
class A
{
public:
A()
{
cout << "A->构造" << endl;
}
~A()
{
cout << "A->析构" << endl;
}
protected:
int _a;
};
int main()
{
A* a = new A[3];
delete[] a;
return 0;
}
通过调试看到下面情况:
![](https://i-blog.csdnimg.cn/blog_migrate/02d4b6ff35d53b0f0a57bb0a94bb5523.png)
这里还有一个问题如下:当我显示写出析构函数和使用默认的差别:
下面我们简单的通过宏来模拟我们new和delete:
#define New_array(Point,type,size) \
do{ \
Point = (type*)operator new(sizeof(type)*n + sizeof(int))\
*(int*)Point = size; \
Point = ((type*)((char*)Point + sizeof(int))); \
for (size_t i = 0; i < size; ++i) \
new(ptr + i)type; \
} while (0);
//
#define Delete_array(Point,type) \
do \
{size_t size = *((int*)Point - 1); \
for (size_t i = 0; i < size; ++i) \
(Point + i)->~type(); \
operator delete(type*)((int*)Point-1) \
} while (false);