在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A.将构造函数设为私有
B.将析构函数设为私有
C.将构造函数和析构函数均设为私有
D.没有办法能做到

编 译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。 因此,

将析构函数设为私有,类对象就无法建立在栈(静态)上了,只能在堆上(动态new)分配类对象 。 ]
因为堆对象的生命周期是由程序员控制的,编译器不会释放动态分配的内存。所以把析构函数设为私有,则该类型需要提供个额外的公有的Destroy函数,此函数可以delete自己。程序员可以手动调用Destroy函数释放内存。(通过自定义函数完成delete功能)

对象创建/销毁步骤

  1. 分配内存
  2. 调用构造函数
  3. 调用析构
  4. 释放内存

自由存储区(free store)

通过重载operator new()改变内存分配行为,唯独定位new不可重载
从技术上来说,堆(heap)是C语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,稍后调用free可把内存交还。而自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。基本上,所有的C++编译器默认使用堆来实现自由存储,也即是缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,这时藉由new运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确。但程序员也可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就区别于堆了。我们所需要记住的就是:

堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储区并不等价。

结论

  • 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。
  • new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。
  • 堆与自由存储区还是有区别的,它们并非等价。

Memory Management - Part I
Difficulty: 3 / 10
http://www.gotw.ca/gotw/009.htm

New创建对象,甚至不用分配内存(定位 new)

语法 Type* p=new (已分配内存的指针)Type;
在这片内存通过构造函数初始化一个Type对象。

  1. void* p=malloc(sizeof(Type));
  2. byte buffer[sizeof(Type)];
  3. Type* ptype0=new Type();//在自由存储区申请内存,初始化对象。
  4. Type* ptype1=new (p) Type;//在p所指内存初始化对象。
  5. Type* ptype2=new (buffer) Type;//在buffer固定大小缓冲区初始化对象。

细说new与malloc的10点区别