• new 和 malloc 的区别 及使用


    Malloc:

    定义上:malloc  memory allocation 动态内存分配 是c中的一个函数

    使用方法:

    extern void *malloc(unsigned int num_bytes)

    num_bytes内存块字节长度。

    内存块大小确定:malloc是通过我们计算然后得到一块新内存,然后指定数据类型并且内存值也是随机的。

    使用时:需要引入头文件库函数 stdlib.h 或是 malloc.h(malloc.h与alloc.h一致)。

    内存分配位置:堆中动态分配的内存。

    具体分配过程:由程序向操作系统申请,操作系统遍历空闲结点链表,将第一个大于申请空间的堆结点分配给程序,然后将空闲结点链表中此节点删掉。

    成功分配:返回值为指向被分配内存的指针。

    失败分配:返回值为空NULL。

    返回类型:void* (未确定类型的指针)。

    void*类型可以通过强制类型转换转换为任意其他类型(因为用户存储数据类型未知,由用户决定数据类型)。

    内存块释放:free()函数 将内存还给程序或操作系统。

    注意:malloc与free都属于c/c++标准库函数,在使用时应该配对 申请之后不释放就会有可能发生内存泄漏。

    使用free时需要检查指针是否为空。

    New:

    new 是c++中的运算符(其地位等同于“+”,“=”)。

    在使用:new时不止分配内存,还会进行初始化,执行相应构造函数,初始化时需要指定数据类型。

    内存分配位置:自由存储区为对象分配内存。

    使用时:无需引入头文件,new是保留字。

    new 和 delete 是配对使用的。

    在使用delete时注意将指针置为0,否则会形成悬垂指针(指针所指内存已被释放,仍指向该内存),造成错误。

    new 可以看做是malloc 加 构造函数的执行,就是new更高级一些。

    new的几种用法:

    1 int *p=new int; //在自由存储区开辟一个int变量   
    2 int *p=new int[10];//在自由存储区开辟一个int数组,有10个元素  
    3 int *p=new int(10);//在自由存储区开辟一个int变量,并初始化为10  

    释放内存时无需检查是否为空。

    如果p等于NULL,则delete p不作任何事情。由于之后可以得到测试,并且大多数的测试方法论都强制显式测试每个分支点,因此你不应该加上多余的 if 测试。

    错误的:

    1 if (p != NULL)  
    2       delete p;  
    3正确的:delete p;

    面试时可能会问到的问题:

    有了malloc/free为什么还要new/delete?

    1)它们都可用于申请动态内存和释放内存。

    2)malloc是库函数只能作用于内部数据类型,对于非内部数据动态对象而言,就不能完成对象的初始化与销毁,即执行构造函数与析构函数,而new 与 delete此类运算符就能够在编译器的控制权限内完成,对象的初始化与销毁任务,即执行构造函数与析构函数。

    为什么C++不把malloc/free淘汰出局呢

    既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

    我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

      注意:如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。

    如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

    区分零值指针和NULL指针


    零值指针,是值是0的指针,可以是任何一种指针类型,可以是通用变体类型void*也可以是char*,int*等等。
        空指针,其实空指针只是一种编程概念,就如一个容器可能有空和非空两种基本状态,而在非空时可能里面存储了一个数值是0,因此空指针是人为认为的指针不提供任何地址讯息。

    malloc 与 new 对于内存泄漏问题

    内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。

     

     
  • 相关阅读:
    LeetCode 109 Convert Sorted List to Binary Search Tree
    LeetCode 108 Convert Sorted Array to Binary Search Tree
    LeetCode 107. Binary Tree Level Order Traversal II
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 103 Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 104. Maximum Depth of Binary Tree
    接口和多态性
    C# 编码规范
  • 原文地址:https://www.cnblogs.com/shilinnpu/p/8191250.html
Copyright © 2020-2023  润新知