1.C语言中malloc,calloc,realloc的不同
malloc/calloc/realloc用来在堆上开辟空间。
(1)malloc
void *malloc(size_t size);
malloc()在内存的动态存储区中分配一块长度为size字节的连续区域
(2)calloc
void *calloc(size_t nmemb,size_t size);
calloc()与malloc()相似,参数size为申请地址的单位元素长度,nemb为参数个数
(3)realloc
void *realloc(void *ptr,size_t size);
realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,size是重新申请的地址空间的大小
它们三者的区别:
malloc不能初始化所分配的内存空间,需要用memset;
calloc会将所分配的空间中的每一位都初始化为0;
realloc 可以改变原有内存空间大小,原有内存的内容保持不变;若不能改变,将会开辟一段新的内存,但不会对新开辟的空间进行初始化
2.总结并剖析malloc/free和new/delete之间关系和差异。
C++通过new和delete动态管理内存
new/delete动态管理对象
new[ ]/delete[ ]动态管理对象数组
malloc/free和new/delete之间的区别和联系
1)它们都是动态管理内存的入口。
2)malloc/free是C/C++标准库函数,而new/delete是C++操作符。
3)malloc/free只是动态分配内存空间/释放空间,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理。
4)malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。
3.剖析new/delete、new[]/delete[]到底做了些什么事情。
new做了两件事
1)调用operator new分配空间;
2)调用构造函数初始化对象。
delete也做了两件事
1)调用析构函数清理对象;
2)调用operator delete释放空间。
new[ ]
1)调用operator new分配空间;
2)调用N次构造函数分别初始化每个对象。
delete[ ]
1)调用N次析构函数清理对象;
2)调用operator delete释放空间。
4.实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
//模拟new[]/delete[]
#define NEW_ARRAY(PTR,TYPE,N) \
do \
{ \
PTR = (TYPE*)operator new(sizeof(TYPE)*N+4); \
(*(int*)PTR) = N; \
PTR = (TYPE*)((char*)PTR + 4); \
for (size_t i = 0; i < N; i++) \
{ \
new(PTR + i)TYPE; \
} \
}while (false);
#define DELETE_ARRAY(PTR,TYPE) \
do \
{ \
int N = *((int*)PTR - 1); \
for (int i = 0; i < N; i++) \
{ \
PTR[i].~TYPE(); \
} \
PTR = (TYPE*)((char*)PTR - 4); \
operator delete(PTR); \
}while (false);
class AA{
private :
size_t i;
public:
AA(size_t i = 10)
{
cout << "AA()" << endl;
}
~AA()
{
cout << "~AA()" << endl;
}
};
int main()
{
AA* P2;
NEW_ARRAY(P2, AA,10);
DELETE_ARRAY(P2, AA);
system("pause");
return 0;
}
运行结果