C++为什么不建议使用malloc,calloc,realloc来分配内存

如题所述

第一个 C++里面有new 和delete可以实现类似功能。
malloc系列是函数,而new是操作符 用new更高效
第二个 对于对象的内存分配 使用new可以调用构造函数
而用malloc则不会, 所以有可能出现不可预知问题, 尤其是派生类对象,如果有虚函数表,那么用malloc出来的类对象,使用就是一场灾难
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-06-07
/*
* File: main.cpp
* Author: Vicky.H
* Email: eclipser@163.com
*/
#include <iostream>
#include <cstdlib>
#include <memory>

class A {
public:

A() {
std::cout << "create A" << std::endl;
}

A(const A& o) {
std::cout << "copy A" << std::endl;
}

~A() {
std::cout << "delete A" << std::endl;
}
};

/*
*
*/
int main(void) {

char* buf1 = (char*) malloc(10); //
char* buf2 = (char*) calloc(1, 10); // 效果虽然与上面一样,不同的是,calloc会将空间初始化为0.

free(buf1);
free(buf2);

std::cout << "---------------------------" << std::endl;

// 为什么C++中不建议使用malloc calloc realloc等C语言函数?因为:这样分配的空间,返回的指针需要通过free来释放,但free释放空间不同于delete,free不会执行析构函数!

A* ap = (A*) malloc(sizeof (class A) * 10);
std::uninitialized_fill_n(ap, 10, A());
free(ap); // 调用1次create A ,1次delete A 10次copy A
return 0;
}

malloc,calloc,realloc的使用方法和注意事项
相比之下,calloc提供了更直观的初始化特性。下面展示其与malloc的差异:最后,realloc函数允许调整已分配内存的大小:realloc需要两个参数:已分配内存的指针和新的大小。如果调整成功,返回值可能是原有地址(如果内存大小变化不大且连续),也可能是新分配的地址(内存大小增加或内存不连续时)。新分配的...

【C】动态内存管理 malloc calloc relloc free 函数详解
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存址。 由于上述的两种情况,realloc函数的使用就要注意一些。示例:realloc(NULL, 40);等价于malloc(40);3.常见的动态内存错误 3.1 对NULL指针的解引用...

C语言callo
C语言中的内存管理函数提供了三种主要操作:calloc、malloc和realloc,它们用于动态地为程序分配内存。首先,void *calloc(size_t nobj, size_t size)函数用于为nobj个长度为size的对象分配内存,返回指向分配区域的指针。如果内存分配失败,它将返回NULL。这个函数的特点是分配的内存区域初始长度为0字节。...

c语言中的动态内存分配函数malloc, calloc, realloc分别是那几个单词...
malloc应该就是memory allocate realloc就是加个re前缀 calloc有人说是complex也有说是clear的,与malloc区别就是多了清0操作

C\/C++内存申请和释放(一)
在C语言中,动态内存申请主要通过malloc函数实现。其基本用法包括动态申请数组和动态申请数组指针。例如,当我们需要创建一个动态数组时,可以使用`int *array = (int*)malloc(n * sizeof(int));`来为指定长度的整数分配内存。除了malloc,还有其他内存申请方式。calloc函数可以同时分配内存并进行初始化,...

calloc和malloc和realloc的区别
参数size为需要内存空间的长度,如: char* p; p=(char*)malloc(20);calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如: char* p; p=(char*)calloc(20,sizeof(char)); 这个例子与上一个效果相同realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为...

内存泄漏检测组件的分析与实现(linux c)-mtrace工具使用
内存泄漏的产生原因主要在于在堆上使用了malloc、realloc、calloc等函数分配了内存空间,但未使用free函数释放对应的空间。这样会导致一段时间后,由于只存在内存分配操作而未释放操作,堆内存资源消耗过度,无法再分配合适的内存,最终可能导致程序崩溃。预防内存泄漏的最佳策略是通过实现内存泄漏检测组件。该组件...

realloc分配内存
void *realloc(void *block, size_t size)给一个已分配的指针block重新内存,大小为size reallc是在malloc的基础上,给一个已经malloc后的指针重新分配内存,你这里没有malloc也就不存在重新分配的问题了。数组地址是固定的,不能改变。这里你应该用指针,不要用数组。int a[N]={1,2,3,4,5,6,...

Dev C++中malloc函数被哪个头文件包含?NOIP复赛让用该头文件吗?_百度...
和以上方法完全等价。不过一般会用new\/delete运算符而不用麻烦的malloc\/free。但是calloc、realloc一般还是习惯用库函数。ANSI标准库函数基本上是给用的,如果不能用应该会在题目中另行说明:http:\/\/www.oibh.org\/?action-viewthread-tid-22227。另外C不能用stdlib就是不能用动态内存了,一般不会限制得...

关于realloc一个很值得探究的问题
的确,不管交换前还是交换后,都对内存进行了非法访问,而且,即使改为 n=(int*)realloc(n,(i+2)*sizeof(int));\/\/注释二,如果把注释一,二两句交换顺序,我认为也有问题,因为并没有对重新分配的内存空间赋值,却在输出时使用了它。relloc函数并不能保证在原来已有的空间处扩大开辟的内存空间...

相似回答