注册 登录
编程论坛 C++教室

帮忙看一下这段程序的运行过程

落叶深蓝色 发布于 2011-09-09 15:21, 388 次点击
程序代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
class Obj
{
    public:
    Obj(void)
    {
        cout<<"Initialization"<<endl;
    }
    ~Obj(void)
    {
        cout<<"Destroy"<<endl;
    }
    void In(void)
    {
        cout<<"In"<<endl;
    }
    void Destroy(void)
    {
        cout<<"Destroy"<<endl;
    }

};
    void UseMallocFree(void)
    {
        Obj *a=(Obj *)malloc(sizeof(Obj));
        a->In();
        a->Destroy();
        free(a);
    }
    void UseNewDelete(void)
    {
        Obj *a=new Obj;
        delete a;
    }
int main()
{

    Obj obj;    //
    UseMallocFree();
    UseNewDelete();
}
4 回复
#2
tisyang2011-09-09 16:28
使用 malloc 给类对象分配内存是不安全的,尤其是类本身在实例化的时候需要额外申请内存。
malloc 申请的内存就算赋值给一个类对象指针,这个类对象并不会在这段内存上进行初始化,构造函数和析构函数都不会被调用。
#3
laznrbfe2011-09-09 19:24
回复 2楼 tisyang
用new对吗?
#4
hoho5682011-09-09 22:11
以下是引用laznrbfe在2011-9-9 19:24:49的发言:

用new对吗?

程序结果表明用new是对的。用new的话,会生成一个临时对象,然后将该临时对象的地址赋值(只要有对象的生成,便会有构造函数和析构函数的调用了)。

你运行程序,结果也说明了这一点。。
#5
hoho5682011-09-09 22:13
用malloc的不安全性也可以在它的使用过程中体现出来;
Obj *a=(Obj *)malloc(sizeof(Obj));
malloc的返回值其实是void *,用了类型转化才换成对象指针,所以根本无从谈起构造函数和析构函数了。
1