zoukankan      html  css  js  c++  java
  • 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);
    };    
  • 相关阅读:
    生病了,难受啊
    2005年1月31号随笔一篇
    [转]永远的Beyond
    关于IE问题,请教和求救
    中国财富排行榜
    这两天简直倒霉透顶了
    Asp.net(C#)给图片加上水印效果
    我不爱的那个女人
    555,我的hotmail从2G变回2M的了
    怀念永远的战神
  • 原文地址:https://www.cnblogs.com/Duikerdd/p/11731577.html
Copyright © 2011-2022 走看看