C++动态内存常见面试题解析

Posted duikerdd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++动态内存常见面试题解析相关的知识,希望对你有一定的参考价值。

           malloc/free和new/delete傻傻分不清?动态内存管理的面试题难道你了?来看这篇文章,包你全会。

    1.malloc/free和new/delete的区别

        (1)malloc/free是函数, new/delete是操作符;

        (2)malloc/free不会调用构造/析构函数,new/delete会调用构造/析构函数;

        (3)malloc申请的空间不能初始化,new申请的空间可以初始化;

        (4)malloc返回的void*需要强转,new后跟的是空间类型,不需要;

        (5)malloc失败返回NULL,使用时需要判空,new失败直接抛异常;

        (6)malloc申请的空间大小需要自己计算,new申请的空间大小,后面跟上空间类型就行;

        (7)new/delete效率比malloc/free稍微低点,因为new/delete的底层封装了malloc/free。

 

    2.请设计一个类,该类只能在堆上创建对象

           将类的构造函数,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,该静态成员函数完成堆对象的创建

class HeapOnly{
  public:
    static HeapOnly* CreateObject()
    {
      return new HeapOnly;
    }

  private:
    HeapOnly(){}
    //C++98
    //1.只声明,不实现。因为实现可能会很麻烦,而你本身不需要   
     //2.声明成私有
     HeapOnly(const HeapOnly&);
        
    // or            
    // C++11        
    HeapOnly(const HeapOnly&) = delete;
};

 

    3.请设计一个类,该类只能在栈上创建对象

      只能在栈上创建对象,即不能在堆上创建,因此只要将new的功能屏蔽掉即可,即屏蔽掉operator new和定位new表达式,注意:屏蔽了operator new,实际也将定位new屏蔽掉   

class StackOnly{
       public:
            StackOnly(){}

       private:
            void* operator new(size_t size);
            void* operator delete(void* p);
};    

 

以上是关于C++动态内存常见面试题解析的主要内容,如果未能解决你的问题,请参考以下文章

搞定Jvm面试 Java 内存区域揭秘附常见面试题解析

C++面试题

常见C++面试题

常见python面试题

C++ 经典面试题

面试必备 | 常见C++笔试面试题整理