new与malloc的区别
realloc是从堆上分配内存的.当扩大一块内存空间时,realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;如果数据后面的字节不够,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上.这句话传递的一个重要的信息就是数据可能被移动.
- int len =7;
- int * a = (int *) malloc (sizeof(int) * len);
- len++;
- int * aold = a; //重新分配前保存a的地址 这个是多余的
- a = (int *)realloc(sizeof(int)* len); //重新分配28+4 = 32字节内存给数组a
前面两句定义了1个长度为7的int 类型数组, 每个元素的字节长度是4, 所以共占28byte 内存.
第3句长度变量+1
第4句 分两种情况:
1) 假如数组a 内存里接着的4个字节还没被其他对象或程序占用, 那么就直接把后面4个字节加给数组a, 数组前面7个旧的元素的值不变, 数组a的头部地址也不变.
2) 假如数组 a内存里接着的4个字节已经被占用了, 那么realloc 函数会在内存其他地方找1个连续的32byte 内存空间, 并且把数组a的7个旧元素的值搬过去, 所以数组a的7个旧元素的值也不变, 但是数组a的头部地址变化了. 但是这时我們无需手动把旧的内存空间释放. 因为realloc 函数改变地址后会自动释放旧的内存, 再手动释放程序就会出错了
- #include <new>//必须使用new头文件
- Manager * pManager = new (nothrow) Manager();
- if(NULL == pManager)
- {
- //记录日志
- return false;
- }
- void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
- { // try to allocate size bytes
- void *p;
- while ((p = malloc(size)) == 0)
- if (_callnewh(size) == 0)
- { // report no memory
- _THROW_NCEE(_XSTD bad_alloc, );
- }
- return (p);
- }
new和new[]的区别,new[]一次分配所有内存,多次调用构造函数,分别搭配使用delete和delete[],同理,delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n;如果不够可以继续谈new和malloc的实现,空闲链表,分配方法(首次适配原则,最佳适配原则,最差适配原则,快速适配原则)。delete和free的实现原理,free为什么知道销毁多大的空间?