new/delete究竟做了些什么?
在理解这个问题之前,我们先看一下下面的这段程序,有这么一个程序段:
class A
{
public:
A() { cout<<"A is here!"<<endl; }
~A(){ cout<<"A is dead!"<<endl; }
private:
int i;
};
A* pA=new A;
delete pA;
在这个简单的程序段里面,new/delete究竟做了些什么?
实际上,这段程序里面隐含调用了一些我们没有看到的东西,那就是:
static void* operator new(size_t sz);
static void operator delete(void* p);
值得注意的是,这两个函数都是static的,所以如果我们重载了这2个函数(我们要么不重载,要重载就要2个一起行动),也应该声明为static的,如果我们没有声明,系统也会为我们自动加上。另外,这是两个内存分配原语,要么成功,要么没有分配任何内存。
size_t是什么东西呢?我在第一次看到这个动动的时候也是十分的困惑,毕竟以前没有见过。size_t在<cstddef>中定义,是一种无符号整数类型(不一定是int),用来保存对象的大小,这一用法是从C语言中借用过来的,现在你应该明白了吧(我学习的时候可是郁闷了好几天,没有人可以问,因为不知道有个csdn:)
new A;实际上做了2件事:调用opeator new,在自由存储区分配一个sizeof(A)大小的内存空间;然后调用构造函数A(),在这块内存空间上类砖砌瓦,建造起我们的对象。同样对于delete,则做了相反的两件事:调用析构函数~A(),销毁对象,调用operator delete,释放内存。不过需要注意的是,new分配一块内存的时候,并没有对这块内存空间做清零等任何动作,只是拿了过来,这块内存上放的仍然是原来的数据(垃圾数据),delete的时候,也只是释放这块内存,归还给操作系统,上面的数据还在上面,所以delete pA之后,pA的值没变,他指向的那块内存的值也没有变,不过似乎有什么问题,我们看一下下面的这个程序段:
int *p=new int(50000);
cout<<*p<<" "<<p<<endl;
delete p;
cout<<*p<<" "<<p<<endl;
我们可以清楚地看到,指针p存放的数据仍然是原来的地址,但是*p的内容却发生了变化,在我的机器上(win2000, VC6)始终是-572662307,不清楚这是为什么,难道系统做了什么手脚?还望高手指教。
在这里我们可以看到,new的工作实际上就是保证相互分离的存储分配和初始化工作能够很好的在一起工作,不过这里可能让初学者迷惑的是,我们定义了一个带有参数的new,但是我们用的时候却没有显式的去调用,而是让系统“神秘”的去提供这个参数。是的,这样做毫无疑问增加了复杂性,但是让基类获取了为一集派生类提供分配和释放服务的能力。
摘自:http://zhidao.baidu.com/question/275047075.html