标签:功能 类型 内存管理 new amp 傻傻 区别 定位 静态
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。
将类的构造函数,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,该静态成员函数完成堆对象的创建。
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; };
只能在栈上创建对象,即不能在堆上创建,因此只要将new的功能屏蔽掉即可,即屏蔽掉operator new和定位new表达式,注意:屏蔽了operator new,实际也将定位new屏蔽掉
class StackOnly{ public: StackOnly(){} private: void* operator new(size_t size); void* operator delete(void* p); };
标签:功能 类型 内存管理 new amp 傻傻 区别 定位 静态
原文地址:https://www.cnblogs.com/Duikerdd/p/11731577.html