C++之new和malloc差别

在C++程序猿面试中。非常easy被问到new 和 malloc的差别。偶尔在quora上逛。看到Robert Love的总结。才发现自己仅仅知道里面的一两项就沾沾自喜,从来没有像这位大牛一样去细致思考这些问题,借着这篇文章细致探讨下这个经典问题。

一、new是操作符。而malloc是函数

void* malloc(size_t);
void free(void*);
void *operator new (size_t);
void operator delete (void *);
void *operator new[] (size_t);
void operator delete[] (void *);

二、new在调用的时候先分配内存,在调用构造函数。释放的时候调用析构函数。

#include <iostream>
using namespace std;

class Player{
public:
    Player(){
        cout << "call Player::ctor\n";
    }

    ~Player(){
        cout << "call Player::dtor\n";
    }

    void Log(){
        cout << "i am player\n";
    }

};

int main(){
    cout << "Initiate by new\n";
    Player* p1 = new Player();
    p1->Log();
    delete p1;

    cout << "Initiate by malloc\n";
    Player* p2 = (Player*)malloc(sizeof(Player));
    p2->Log();
    free(p2);
}

输出结果为:

Initiate by new

call Player::ctor

i am player

call Player::dtor

Initiate by malloc

i am player

三、new是类型安全的,malloc返回void*

四、new能够被重载

五、new分配内存更直接和安全

六、malloc 能够被realloc

#include <iostream>
using namespace std;

int main(){
    char* str = (char*)malloc(sizeof(char*) * 6);
    strcpy(str, "hello");
    cout << str << endl;

    str = (char*)realloc(str, sizeof(char*) * 12);
    strcat(str, ",world");
    cout << str << endl;

    free(str);
}

输出结果为:

hello

hello,world

七、new错误发生抛出异常。malloc返回null

八、malloc能够分配随意字节,new 仅仅能分配实例所占内存的整数倍数大小

结论:

学习知识的时候假设能把握整个技术的发展历史和脉络,这样对有些比較难懂的知识就非常easy理解了。

将这些技术放在其所存在的年代,考虑到当时的软硬件环境。能够更好的理解技术本身。

这篇文章是非常浅层次的说明了他们的差别。假设有兴趣能够去研究他们的详细实现。能发现更大的乐趣。

原文地址:https://www.cnblogs.com/llguanli/p/8492561.html

时间: 2024-08-03 11:30:28

C++之new和malloc差别的相关文章

malloc()与calloc差别

Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from the other. Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from

malloc、calloc、realloc三者的差别

1.malloc 作用:分配内存块 原型:void *malloc(size_t size);size表示要分配的字节数 返回值:返回一个指向所分配空间的void指针,假设没有足够的内存可用,则返回NULL. 假设要返回一个指向特定类型的指针,则在返回值上用一个类型转换.比如: char* p; p=(char*)malloc(20); 假设size是0,则malloc在堆中分配一个长度为0的项,而且返回一个指向那项的有效指针.比如: int *p1=(int*)malloc(0) //ok,p

new/malloc的差别

1. malloc()函数 1.1 malloc的全称是memory allocation.中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块.假设分配成功则返回指向被分配内存的指针.分配失败返回空指针NULL. 当内存不再使用时,应使用free()函数将内存块释放. 1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空

C++ - new与malloc的差别

malloc是C++语言的标准库函数:而new是C++语言中的操作符. new返回指定类型的指针,而且能够自己主动计算所需空间的大小:而malloc必需要由用户自己计算所需空间大小,并在返回后强行转换为实际类型的指针. malloc仅仅管内存分配,不能对所得的内存进行初始化,其所获内存空间中上的值是随机的:而new除了分配内存处,还会对对象做初始化.

多进程与多线程差别

 在Unix上编程採用多线程还是多进程的争执由来已久,这样的争执最常见到在C/S通讯中服务端并发技术 的选型上,比方WEBserver技术中.Apache是採用多进程的(perfork模式,每客户连接相应一个进程,每进程中仅仅存在唯一一个运行线程), Java的Web容器Tomcat.Websphere等都是多线程的(每客户连接相应一个线程,全部线程都在一个进程中). 从Unix发展历史看,伴随着Unix的诞生进程就出现了.而线程非常晚才被系统支持,比如Linux直到内核2.6.才支持符合P

char* 和char[]的差别

下面内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入: 在实习过程中发现了一个曾经一直默认的错误,相同char *c = "abc"和char c[]="abc",前者改变其内 容程序是会崩溃的,而后者全然正确. 程序演示: 測试环境Devc++ 代码 #include <iostream> using namespace std; main() { char *c1 = "abc"; char c2[] = "

堆和栈的差别(转过无数次的文章)

一.预备知识—程序的内存分配    一个由C/C++编译的程序占用的内存分为下面几个部分    1.栈区(stack)—   由编译器自己主动分配释放   ,存放函数的參数值,局部变量的值等.其    操作方式相似于数据结构中的栈.    2.堆区(heap)   —   一般由程序猿分配释放,   若程序猿不释放,程序结束时可能由OS回    收   .注意它与数据结构中的堆是两回事,分配方式倒是相似于链表,呵呵.    3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一

Linux程序存储结构与进程结构 堆和栈的差别

摘要:本文主要讲述了Linux系统中.程序存储结构(代码区.数据段和BBS区)与进程的基本结构(代码区.数据段.BBS区.堆和栈).以及堆和栈的差别. Linux程序存储结构与进程结构 1.Linux程序存储结构 在Linux系统下,程序是一个普通的可运行文件,图1是一个Linux下ELF格式可运行文件的基本情况. 图1 ELF格式可运行文件的基本信息 能够看出,此ELF格式可运行文件在存储时,没有调入到内存,分为代码区(text),数据区(data)和为初始化区(bss)3个部分.各段基本说明

【转】 C++中的new VS C语言中的malloc

作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 前几天一个朋友去面试百度空间的一个职位,被问及这个问题,我听后说了几点,不过感觉还是不透彻,所以上网查阅了一些资料,自己又想了想,总结一下. 动作不同: 在C++中,new一个对象时,程序完成对象的空间的分配的同时,构造函数也被调用,类似,delete一个对象时,对象的空间被释放的同时析构函数也被调用. 在C中,malloc和free 则没有构造函数和析构函数被调用这个动作.当然,在没有特定的构造函数或析构函