首页
学习
活动
专区
圈层
工具
发布

new和malloc的作用是一样的_商城面试题

new和malloc的区别是C/C++一道经典的面试题,我也遇到过几次,回答的都不是很好,今天特意整理了一下。 0. 属性 new/delete是C++关键字,需要编译器支持。...而malloc则需要显式地指出所需内存的尺寸。 2. 返回类型 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。...而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。 3. 分配失败 new内存分配失败时,会抛出bac_alloc异常。...重载 C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。...自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。

61320

C和C++的区别和联系

这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。...当然,数字类型和指针类型也可以相互转换,但通常认为这样做是不安全而且也是没必要的。强制类型转换可以避免编译器的警告。 ?...上面两个都是C风格的强制类型转换,C++还增加了一种转换方式,比较一下上面和下面这个书写方式的不同: ? 使用强制类型转换的最大好处就是:禁止编译器对你故意去做的事发出警告。...但是,利用强制类型转换说明使得编译器的类型检查机制失效,这不是明智的选择。通常,是不提倡进行强制类型转换的。除非不可避免,如要调用malloc()函数时要用的void型指针转换成指定类型指针。...为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是函数不会用到这个参数。下面给出使用了无名参数的C++函数代码: ?

1.8K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++内存管理(1)

    ,我们是没有办法使用C语言里面的那些函数为类开辟空间的; (2)我们使先看一下new为单个的内置数据类型开辟空间的使用方法: 这个就是C语言和C++的不同的写法,C语言需要进行强制类型转换,但是C++不需要...; 在C++里面,我们可以直接使用new为int类型的数据开辟空间写法就如同上面的,而且C++里面使用new开辟空间的时候,不需要进行强制类型的转换,我们在开辟完成之后可以直接进行初始化的操作,初始化的方法就是上面展示的在...,是不需要我们进行手动的释放的,而且对于数组类型的,我们可以直接在new后面类型后面加上中括号里面写上数组里面的元素的个数即可; (5)malloc需要进行强制类型的转换,但是new不需要,因为new的后面就是数据的类型...; (8)总的来说,我们需要从两个方面认识到为什么C++里面要引入new和delete, 一方面就是为了让我们对于空间的开辟的时后,更加简洁,这个简洁体现在 不用进行初始化, 不用担心开辟失败的问题..., 不用进行强制类型的转换, 不用在多个数据的时候计算空间的大小; 另一方面就是解决对于自定义类型的空间开辟的问题,让这个delete、new自动调用析构函数和构造函数进行空间的初始化以及内容的清理工作

    13410

    透彻理解CC++内存管理:从原理到实战的完整指南

    C/C++内存管理1....C++内存管理方式C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。...不同的地方是:特性 malloc/free new/delete 语言性质 C语言函数 C++操作符 初始化...不初始化内存 可以初始化 大小计算 需手动计算并传递 自动计算类型大小 返回值 void*,需要强制转换返回正确类型的指针 失败处理 返回...| void*,需要强制转换 | 返回正确类型的指针 || 失败处理 | 返回NULL,需判空 | 抛出异常,需捕获 || 自定义类型 | 不调用构造/析构函数 | 自动调用构造

    25400

    c语言中malloc的作用,malloc函数-malloc函数,详解

    C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。...所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如: #include typedef int ListData; ListData *data;...C头文件, 调用时 malloc(x); C++头文件, 注意没有后缀名 调用时要写 std::malloc(x) 注意std前缀 C语言中,malloc函数动态分配内存后,如果不用free… 如果可以被系统释放...(int *)对malloc返回值强制转换,而第二条不用?...强制转换本来就不是必须的,malloc()返回的是void *类型的,会根据不同的指针变量而自动转换成所需要的类型,只不过在有些编译系统中,不加类型转换会收到WRONG而已。

    2.7K30

    【C++初阶】:C&C++内存管理

    malloc( 20*sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋值给指针p...但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0; 既然calloc不需要计算空间并且可以直接初始化内存避免错误...calloc函数由于给每一个空间都要初始化值,那必然效率较malloc要低,并且现实世界,很多情况的空间申请是不需要初始值的,这也就是为什么许多初学者更多的接触malloc函数的原因。...3、C++内存管理方式 C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理...,返回的是NULL,因此使用时必须判空,new不需要,但是new需 要捕获异常 6、 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化

    25310

    C++ malloc 与 new 的区别

    属性 new/delete 是 C++ 的操作符,而 malloc/free 是库函数。...参数 使用 malloc 为对象指针分配内存,要明确指定分配内存的大小,而 new 不需要,编译器会根据类型信息自行计算。...返回类型 new 分配内存成功,返回对象指针,无须进行类型转换;而 malloc 分配成功返回 void* 类型指针,需要通过强制类型转换将 void* 指针转换成我们需要的类型。...自由存储区是 C++ 基于 new 操作符的一个抽象概念,凡是通过 new 操作符进行内存申请,该内存即为自由存储区。...---- 参考文献 经典面试题之new和malloc的区别 - CSDN博客 C++ new 的三种面貌 - CSDN博客 C++ 自由存储区是否等价于堆? - melonstreet - 博客园

    58910

    C++:27---new delete malloc free

    上一节我讲了new和delete,有人问这不是和C语言的malloc/free为C的标准库函数差不多么 void* malloc(size_t size)//参数代表字节个数 void free(void...* pointer)//参数代表内存地址 new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator delete(); 实际上我在上一节已经讲了...; //开辟多个空间 int*p2=new int[4]; delete []p2; } 由此可知: (1)malloc开辟空间类型大小需手动计算,new是由编译器自己计算; (2)malloc...返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针; (3)malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时...8.最后一点对于new/delete与malloc/free申请内存位置说明,malloc我们知道它是在堆上分配内存的,但new其实不能说是在堆上,C++中,对new申请内存位置有一个抽象概念,它为自由存储区

    72330

    探索C嘎嘎:内存管理

    正文: 1.C/C++的内存分布 1.1.C/C++中程序区域内存划分 在进行讲解动态内存管理之前,小编先给各位读者朋友讲述一下再C/C++中的程序区域内存划分,可能很多读者朋友在学习C语言的时候就知道了这些内存区域...,但难免可能会忘掉一部分(就比如小编自己),所以小编先给读者朋友科普一下区域内存的划分,如下图所示: 为了让各位读者朋友了解的更加深刻一些,小编也给出了文字进行补充说明: 1.栈又叫堆栈(和数据结构的堆栈不同...,返回值是void*,所以如果我们想开辟整形的空间,那就必须用到强制类型转换了,即(类型),什么类型都可以,小到字节,大到类都是可以开辟出来的,下面小编就拿·开辟四个大小为int的空间进行举例: int...,上面的讲解也说了,它和malloc函数是相同的返回值,所以此时我们还需要用到强制类型转换,下面小编展示一下对于calloc使用的代码: int* arr1 = (int*)calloc(4, sizeof...*,在使用的时候一定要强转,new不需要,因为new后面会跟上开辟空间的类型。

    14910

    整理了70道C语言与C++常见问答题

    加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。...4、reinterpret_cast 几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用; 5、为什么不使用C的强制转换?...C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。 37 C++的空类有哪些成员函数 缺省构造函数。 缺省拷贝构造函数。 省析构函数。 赋值运算符。...除非所需转换本身是低级别的,否则应- 使用其他强制转换运算符之一。...不能,malloc /free主要为了兼容C,new和delete 完全可以取代malloc /free的。malloc /free的操作对象都是必须明确大小的。而且不能用在动态类上。

    3.5K01

    浅谈malloc()与free()

    我们在使用的时候,习惯对返回值进行强制类型转换: char * p = NULL; p = (char *)malloc(sizeof(char)); ANSI C以前的C,因为没有void*这种类型,...所以在使用malloc函数时通常需要对其返回值进行强制类型转换。 在ANSI C中,malloc函数的返回值为void*。void*类型是可以直接赋值给其他任何类型的指针。...所以,上面的强制类型转换操作现在已经不需要了。...然而在c++中,任何类型的指针都可以赋给void*,而void*却不可以赋给其他类型的指针,所以在c++中使用malloc函数的时候,强制类型转换是必须的。...另一方面,在c++中应该使用new来分配内存。 l  malloc在堆上分配内存 malloc函数分配的内存是在堆(heap)上的。

    1.6K40

    【C++初阶】一文讲通C++内存管理

    C语言中动态内存管理方式 malloc/calloc/realloc/free 这是C语言提供的动态内存管理函数,如果你对它们还不是很了解,不妨看一看C语言动态内存管理,因为C++的动态内存管理关键字基本都是对它们的封装...,了解它们能更好地理解C++的动态内存管理的原理。...C++内存管理方式 尽管C语言内存管理方式在C++中可以继续使用,但它们在有些地方会无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。...4. 3 自定义类型 new的原理 调用operator new函数申请空间并强制类型转换 在申请的空间上执行构造函数,完成对象的构造 delete的原理 在空间上执行析构函数,完成对象中资源的清理工作...调用operator delete函数释放对象的空间 new T[N]的原理 调用operator new[]函数,在operator new[]中完成N个对象空间的申请,并强制类型转换 在申请的空间上执行

    21510

    CC++面试常问题集(2)

    7、基类的析构函数为什么要用virtual虚析构函数? C++中基类采用virtual虚析构函数是为了防止内存泄漏 具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。...在C++,有五种函数不能被声明成虚函数,分别是:非成员函数、构造函数、静态成员函数、内联成员函数、友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数。 1....它们都可用于申请动态内存和释放内存; new/delete会调用对象的构造/析构函数, 而malloc/free只会分配/释放内存; malloc与free是C++/C语言的标准库函数,new/delete...malloc返回的是指向一块内存区域的原始指针, 需要进行强制转换, 而且没有构造对象, 里面的东西还是原来的样子; 5、malloc开辟空间类型大小需手动计算,new是由编译器自己计算; 6、malloc...返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针; 8、对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是

    1.4K10

    CC++内存管理

    的实现原理 定位new malloc/free和new/delete的区别 内存泄漏 C/C++内存分布 对于C/C++计算机是这样分配内存的: 计算为什么要分配就像国内的某个省里面有很多地区...C语言中动态内存管理方式 这里是C语言的动态内存: C语言动态内存管理 C++中动态内存管理 new与delete 在C++中对于动态内存管理也进行了一定的优化,C++讲究的是封装。...endl; } void print() { cout << _a << endl; } private: int _a; }; int main() { N* p = new N;//这里不需要强制类型转化...(p)N(); delete p; return 0; } 那么会有人问这里为什么不一开始就用new进行初始化呢?...malloc返回的时候是void*,需要强制类型转换;new后面的就是空间类型。 malloc开辟空间的时候需要我们计算大小然后传递;new如果想开辟连续的空间后面加[],里面添加个数即可。

    52500

    记一次阿里实习生电面经历

    不过他也没提反对意见,就下一题了) ---- 后来我自己手动敲了一下代码,需要注意的问题是指针是不能直接进行求余或位操作的,进行指针到int类型的强制类型转换是失败的。...所以我尝试了reinterpret_cast 如果是C++的话,就: int pp = reinterpret_cast(p); // p是char *类型 C语言虽然没这个功能,但其实要想比较指针地址是否是...但是我们可以进行一个小转换: //a 是malloc的返回值,char *类型 if ((a - (char *)0) & 7) { .... } 当然这段代码C++也可以用。...要注意的是malloc的返回值最好要强制类型转换为 char *: // 比如分配一百个字符的空间。...这也是为什么我们通常把malloc返回值转换为char *而不是int *的原因。 8. 回调函数 问:“C++中如何实现回调函数” 回调函数,挺熟的名字,callback。。。

    56010

    【C++】CC++内存管理

    在之前C语言的学习中,我们学过了C是如何进行动态内存管理的,也简单的了解过C/C++程序的内存开辟。 这篇文章呢,我们重点来学习一下C++的内存管理方式。 1....C++内存管理方式 C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式: 通过new和delete操作符进行动态内存管理。...int* pp1 = (int*)malloc(sizeof(int)); 那在C++中,我们就可以这样: int* p1 = new int; 直接用一个操作符叫做new,我们也不需要sizeof...计算大小,直接给类型就行了,而且也不需要强制类型转换。...,那大家思考一下: C++搞出来这样新的动态内存管理的方式,仅仅是为了用起来比C语言方便,简洁一点吗? 那他会不会进行一些优化,比如,C++里这样搞会对空间进行初始化?

    31810
    领券