C++的new和delete功能小窥
2007-11-23 21:02
281 查看
C++在new和delete的时候到底在干些什么?
今天写了一个小程序测试一下C++在new和delete的时候到底在干些什么。
int g_num = 3;
class A
{
public:
int value;
A(int a):value(a){cout<<"A("<<a<<") called"<<endl;}
~A() {cout<<"~A("<<value<<") called"<<endl;}
void* operator
new (size_t size)
{
cout<<endl<<"new "<<size<<endl;
return &g_num;
}
void
operator
delete(void* p)
{
cout<<"delete"<<endl;
}
};
为了检测new和delete的动向,我重载了new和delete函数。
测试new的功能的代码如下:
cout<<g_num<<endl;
cout<<endl;
A *a = new A(1);
cout<<g_num<<endl;
cout<<a->value<<endl;
输出结果为:
g_num=3
new 4
A(1) called
g_num=1
a=1
由于A的new函数并没有分配内存,只是把g_num的地址赋给了它,所以A的值改变也直接导致了g_num的值改变。
由打印信息可以看出,"new A(1)"其实执行了两个函数:
调用new分配内存
调用A(1)实现初始构造
而默认的new函数就只是调用了malloc和sizeof分配了一下内存而已,我以前还一直以为这是一个函数,构造函数也是在new中调用的。
测试delete的功能的代码如下:
delete a;
输出结果如下:
~A(2) called
delete
这里也可以看出,"delete a"也是执行的两个函数:
调用析构函数执行析构操作
调用delete释放内存
此时,如果直接调用系统自带的delete,则打印完"~A(2) called"程序直接挂掉了,可见,默认的delete是调用free来释放内存的(本例中a的内存是建立在g_num上的,故free(a)时也free了g_num,从而导致程序挂了)。
今天写了一个小程序测试一下C++在new和delete的时候到底在干些什么。
int g_num = 3;
class A
{
public:
int value;
A(int a):value(a){cout<<"A("<<a<<") called"<<endl;}
~A() {cout<<"~A("<<value<<") called"<<endl;}
void* operator
new (size_t size)
{
cout<<endl<<"new "<<size<<endl;
return &g_num;
}
void
operator
delete(void* p)
{
cout<<"delete"<<endl;
}
};
为了检测new和delete的动向,我重载了new和delete函数。
测试new的功能的代码如下:
cout<<g_num<<endl;
cout<<endl;
A *a = new A(1);
cout<<g_num<<endl;
cout<<a->value<<endl;
输出结果为:
g_num=3
new 4
A(1) called
g_num=1
a=1
由于A的new函数并没有分配内存,只是把g_num的地址赋给了它,所以A的值改变也直接导致了g_num的值改变。
由打印信息可以看出,"new A(1)"其实执行了两个函数:
调用new分配内存
调用A(1)实现初始构造
而默认的new函数就只是调用了malloc和sizeof分配了一下内存而已,我以前还一直以为这是一个函数,构造函数也是在new中调用的。
测试delete的功能的代码如下:
delete a;
输出结果如下:
~A(2) called
delete
这里也可以看出,"delete a"也是执行的两个函数:
调用析构函数执行析构操作
调用delete释放内存
此时,如果直接调用系统自带的delete,则打印完"~A(2) called"程序直接挂掉了,可见,默认的delete是调用free来释放内存的(本例中a的内存是建立在g_num上的,故free(a)时也free了g_num,从而导致程序挂了)。
相关文章推荐
- C++的new和delete功能小窥
- c++ 中的重载全局new,delete
- windows C++ new/delete内存大小
- C++ 操作符new和delete
- C++ 中的 new/delete 和 new[]/delete[]
- C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C++中的new和delete操作符
- C++中关于new和delete的使用
- 深入浅析C++的new和delete
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- c++中new和delete的使用方法
- C++中new与delete问题学习
- C++中new、delete 与new[]、delete[]
- C++中的 new / delete
- 浅谈 C++ 中的 new/delete 和 new[]/delete[]
- C++中的new/delete和new[]/delete[]
- More Effective C++ 条款8 了解各种不同意义的new和delete
- 【转】浅谈 C++ 中的 new/delete 和 new[]/delete[]
- C++ 中的 new/delete 和 new[]/delete[]
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free