///q让一个类只能在栈上分配,不能在堆上分配
class foo {
private:
void *operator new(size_t); //声明成private应该是阻止对new的调用。
};
int main()
{
foo f;
foo *p = new foo;
return 0;
}
/r让在栈上分配类的对象的企图再编译就不可能
/rr
IMO, generally it is impossible to do this withoutsupport from the OS or compilation environment, sinceit is difficult to determine whether the object ison the heap or not...
For some very special system, this is possible sinceyou can control the heap address/length for some embedded system, but we still do not have a general solution...
/rrr
注视掉 foo *p = new foo;就可以通过了。
///q让一个类只能在堆上分配,不能在栈上分配
让类只能在堆上分配也可以
析构函数protected.
加个public成员函数destroy() {delete this;}
这样A *a=new A;
析构的时候a->destroy();
/r
析构函数是默认必须要被调用的
你这样做,programmer调用完destroy后,系统还是会调用析构函数
所以,我觉得不可能不让用户在栈上分配吧…
/rr
destroy中已经调用了析构函数,并释放了内存
不用再调了,你写个程序试试
///sitg
1.采用set_new_handle 函数来处理内存万一分配不足的问题。
2.先分配一个大块,然后在已经分配的块里进行new。
3.假使有n个相同的对象。则可以这样处理、
直接分配new [4000],用链表来存储这些对象,使用的时候从链表里取,表该节点标识正使用,如果不用了,直接标识为未使用,这样就会减少分配和释放的内存消耗。
谢谢sitg了,讲得如此详细。应该好好加油学习,不懂就问这些大牛。离开了tsinghua之后,就没有机会了…多学习多找问题。
堆栈基本知识
堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念
都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。
在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。
这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支
持的数据类型,并不直接支持其他的数据结构。
因为栈的这种特点,对栈的使用在程序中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的call指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操作,而子程序中的ret指令则隐含从堆栈中弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因。
和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。基本的