C++中的基础问题——virtual destructor问题,new与malloc区别
来源:互联网 发布:网络视频 编辑:程序博客网 时间:2024/06/16 02:19
第二:new和malloc的区别(延伸问题,怎么样的类可以用new[])
今天群里有人说了这两个问题,当时有点木,感觉知道一点有知道的不多,于是(内事不决问百度,外事不决问谷歌)。
找了一下发现两个帖子不错,就贴了过来。
http://blog.csdn.net/starlee/article/details/619827
用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:
有下面的两个类:
{
public:
ClxBase() {};
virtual ~ClxBase() {};
virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
class ClxDerived : public ClxBase
{
public:
ClxDerived() {};
~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
代码
pTest->DoSomething();
delete pTest;
的输出结果是:
Output from the destructor of class ClxDerived!
这个很简单,非常好理解。
但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
http://www.cppblog.com/Lee/archive/2009/03/09/75990.html
相同点:都可用于申请动态内存和释放内存
不同点:
(1)操作对象有所不同。
malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。
(2)在用法上也有所不同。
函数malloc 的原型如下:
void * malloc(size_t size);
用malloc 申请一块长度为length 的整数类型的内存,程序如下:
int *p = (int *) malloc(sizeof(int) * length);
我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。
- C++中的基础问题——virtual destructor问题,new与malloc区别
- virtual destructor问题
- 大爱C++——new与malloc的区别
- C/C++中的malloc、calloc与new的区别
- c/c++ new与malloc的区别及使用时注意的问题
- c++中的new与malloc的区别
- c中malloc与new的区别
- c++-new与malloc的区别
- C/C++——C++中new与malloc的10点区别
- C++中的 virtual destructor
- new与malloc的奇怪问题?
- 关于new 与 malloc的一个问题
- new与malloc区别
- malloc与new区别
- malloc与new区别
- new与malloc区别
- new与malloc区别
- malloc与new区别
- Linux目录权限
- lua使用 tinycc
- yii使用CUploadedFile上传文件的一般方法
- android中的一些开源项目
- Response.ContentType 详细列表
- C++中的基础问题——virtual destructor问题,new与malloc区别
- 模态对话框和非模态对话框的消息循环
- 个人学习1之-DATETIME数据类型】 .
- android Application类的详细介绍 .
- DLL编程的导入导出,__declspec(dllimport),__declspec(dllexport)
- 完全卸载sql server 2005效果如同重做系统
- <S:date 的使用方法
- android 调用其它应用的Activity
- Shell脚本学习-程序调试