• new和malloc区别,delete和delete []区别


    面试被问到上述问题,所以特地总结一下:

    一、new和malloc的区别。

    1.new可以返回指定类型的指针,并且自动分配内存大小;malloc需要计算手动计算分配空间的大小,并且返回值需要强转为实际类型的指针。

    2.malloc只会进行内存分配,不会进行初始化,所以其值是随机的;new在内存分配的同时会进行初始化。

    3.malloc分配失败会返回空指针NULL;new分配失败会抛出std::bad_alloc异常

    这里插入一个例子(还没太明白,先mark在这里)

    #include<iostream>
    using namespace std;
    
    void* operator new(std::size_t) throw (std::bad_alloc)
    {
            throw bad_alloc();
    }
    
    void operator delete(void* p) throw() 
    {
    }
    
    class widget   
    {
    public:
        widget()
        {
            cout << "widget()" <<endl;
        }    
    };
    
    int main()
    {
        try
        {
            widget   *pw1   =   new   widget;//   分配失败抛出std::bad_alloc  
            if(pw1   ==   0)    //   这个检查一定失败
            {
                cout << "pw1" <<endl; 
            }
        }
        catch(...) 
        {
            cout << "throw "<< endl;
        }
    
        try
        {
            widget   *pw2   =   new   (nothrow)   widget;   //   若分配失败返回0
            if(pw2   ==   0)    //   这个检查可能会成功
            {
                cout << "pw2" <<endl;
            }
            }    
        catch(...) 
        {
                cout << "throw "<< endl;
        }
    
        return 0;
    }
    View Code

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

    简而言之:malloc/free是库函数,new/delete是C++的运算符。malloc/free不能执行构造函数和析构函数,在动态分配内存的时候也不能进行初始化,不能完成对象的内存管理。

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

    因为C++经常调用C函数,而C程序只能用malloc/free管理动态内存。

    (参考:http://www.cnblogs.com/fly1988happy/archive/2012/04/26/2470542.html)

    二、delete和delete []区别

    delete 释放new分配的单个对象指针指向的内存
    delete[] 释放new分配的对象数组指针指向的内存

    1.对于简单类型来说

      int *a = new int[10];
       delete a;
       delete [] a;

    两者效果相同。

    2.对于自定义的对象来说

    A *a = new A[10];

    delete a;

    delete []a;

    delete a只会调用a[0]的析构函数,a[1]-a[9]分配的空间不会被释放。

    delete []a;会调用a[0]-a[9]的析构函数,释放a指针指向的全部内存空间,会逐一调用对象的析构函数。

    (参考:https://www.cnblogs.com/wangjian8888/p/7905176.html)

    三、使用new[]/delete[]时的内存分布情况

    对非内置对象new[]时会多分配4个字节,因为需要存放析构时的对象个数,对于内置类型则不需要这个4个字节。

    (参考https://blog.csdn.net/qq_33573235/article/details/79485266,讲的非常详细了)  

  • 相关阅读:
    C#-------------枚举
    C#-------------类型构造器
    C#-内存天下
    线程在C#中的使用
    C#遗忘笔记--品味类型
    二分查找算法(C#实现)
    Linq 表达式树
    javascript中的对象
    this绑定的顺序
    弹出对话框
  • 原文地址:https://www.cnblogs.com/Brickert/p/10711228.html
Copyright © 2020-2023  润新知