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++动态内存常见面试题解析的主要内容,如果未能解决你的问题,请参考以下文章