C/C++——new/delete和malloc/free的区别
new/delete和malloc/free的区别
- 扩容操作:
对于malloc是有一个realloc函数对应用于扩容的;
对于new,只能再new一个,for循环赋值过去,把原来的delete掉;
- 对于 对象:
malloc只进行空间的申请,不调用构造函数初始化对象。free也不会调用析构函数。
这段代码什么也不会输出。
#include <iostream>
using namespace std; class A {
public:
int x;
A() {
x = ;
cout << "constructor." << endl;
}
~A() {
cout << "destructor." << endl;
}
};
int main() {
A *a = (A *)malloc(sizeof(A));
free(a);
return ;
}
使用new操作符的三个步骤:
- 调用operator new() 函数 分配用于存储 相应对象的 指定大小的 内存空间。
- 调用 构造函数。
- 返回指向该对象的指针(malloc返回的是void *指针)。
使用delete操作符的两个步骤:
- 调用 析构函数。
- 调用operator delete() 函数释放内存空间。
PS:上次用C++写单链表,还因为 1 出了错,X_X。
~LNode() {
LNode *p = this->next;
while (p) {
LNode *t = p->next;
delete p;
p = t;
}
}
- new/delete可以进行重载
C++对new/delete函数进行了很多类型的重载,通常底层是用malloc/free来实现的。
其他还有一些我们已经当成习惯的区别:
- 在处理数组时,free(array); delete[] array;
- 内存分配失败,new会抛出异常,malloc会返回NULL,所以一般用malloc后面都会加 if ( ..... == NULL )
- 一个是C语言的库函数,需要#include<malloc.h>;一个是关键字。
- 对于C语言程序(*.c文件),只能使用malloc/free。
- 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
此外还有一些
node* n1 = (node*)malloc(sizeof(node));//只会分配内存空间
//对于下面两个,如果没重写了默认构造函数,则它们是没有区别的
//如果没有自己重写默认构造函数(当然也没有写构造函数),则new node只是分配内存空间,new node()会调用默认构造函数
node* n2 = new node;
node* n3 = new node();
C/C++——new/delete和malloc/free的区别的更多相关文章
- new/delete 和malloc/free 的区别
new/delete 和malloc/free 的区别 一.基本概念malloc/free:1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumB ...
- new/delete与malloc/free的区别
new/delete与malloc/free的区别 参考: https://blog.csdn.net/u013485792/article/details/51329541 https://www. ...
- new/delete和malloc/free的区别
通俗易懂版本:http://zhidao.baidu.com/question/86185100 1 new/delete和malloc/free最大区别是对对象的理解. 如果你使用 Foo* foo ...
- new/delete 与 malloc/free的区别
一.概述 在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动 ...
- C++中,new/delete和malloc/free的区别
1.new/delete是C++的操作符,而malloc/free是C中的函数. 2.new做两件事,一是分配内存,二是调用类的构造函数:同样,delete会调用类的析构函数和释放内存.而malloc ...
- [C/C++] new/delete和malloc/free基本区别
/**便于遗忘时复习**/ 区别一:本质 new/delete 在C++中是运算符不是函数,需要编译器支持.malloc/free是库函数,需要头文件支持,在C语言中使用. 区别二:开辟内存大小 用 ...
- new/delete、malloc/free 的区别
相同点 1.都可以动态的申请或释放内存 2.存储方式相同,动态申请的内存都存放在堆中,无法自动释放,要调用对应的delete和free 区别 1.new能自行的计算需要分配的空间,malloc需要 ...
- c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
1. 引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d; //引用 int * const e=d; //只读指针,e指向d,不可修改e指 ...
- new、delete与malloc、free的详解
内容清单: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
随机推荐
- nodejs文件上传组件multer使用
多图上传,发送端: var express = require('express') var rp = require('request-promise') var fs = require(&quo ...
- Java根据国家二字码获取国家英文名称,中文名称实例
import org.apache.commons.lang.StringUtils; public class CountryUtil { /** * 根据国家二字码获取国家对应的中文(英文,cod ...
- Bash:获取当前脚本路径
可以使用readlink命令必须加上-f参数,readlink用于读取链接文件所指向的文件,这样对于一些建立了软连接的脚本文件的话非常适用,而对于一般的脚本文件需要加上-f参数否则readlink文件 ...
- C#迭代器、装箱/拆箱、重载等
迭代器 迭代器是什么? 迭代器是作为一个容器,将要遍历的数据放入,通过统一的接口返回相同类型的值. 为什么要用迭代器? 为何了为集合提供统一的遍历方式,迭代器模式使得你能够获取到序列中的所有元素而不用 ...
- js for循环中点击事件中无法获取每一个i值的问题
好像是第二次遇到这个问题,必须要总结一下!! <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- TAT
瞎扯 继\(HNOI,\)学科\(,CTSC, APIO\)连续爆炸之后 曾一度的怀疑人生,没有任何搞学习的欲望 不断的反省自己:我为什么这么菜? 然后回去搞学科,一直处于一个颓废的状态 后来得知\( ...
- .net C# Sql数据库SQLHelper类
using System;using System.Collections.Generic;using System.Text;using System.Collections;using Syste ...
- <Android 基础(二十一)> Android 屏幕适配
基本概念 1. 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 屏幕尺寸是指屏幕对角线的长度.单位是英寸,1英寸=2.54厘米 屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向 ...
- (WF, Debug) System.Xaml.XamlObjectWriterException: Cannot create unknown type '{clr-namespace:xx;assembly=xx}xx'.
Load WF 后一开始运行的时候就发现 System.Xaml.XamlObjectWriterException: Cannot create unknown type '{clr-namespa ...
- java笔记--重定向输出流实现程序输出到日志
重定向输出流实现程序输出到日志 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877248.html "谢谢-- 利用Sy ...