发新话题
打印

求个C++中的析构函数的详细解释

求个C++中的析构函数的详细解释

。。。学了段时间C++

析构函数有点小问题想请教下

在析构里大家常用的两个宏

#define SafeRelease(pObject) if(pObject!=NULL){pObject->Release();pObject=NULL;}
#define SafeDelete(p) {if(p) {delete (p); (p)=NULL;}}//删除对象
#define SafeDeleteArray(p) {if(p) {delete[] (p); (p)=NULL;}}//删除数组对象

想详细问下这个3个宏定义的区别
个人认为是:SafeRelease释放接口对象
                     SafeDelete 删除指针对象

有时候很疑问,为什么定义的私有成员无法用这两个函数释放或删除呢?
。。。想问下这3个函数的具体用的地方和不同点。谢谢

TOP

#define SafeRelease(pObject) if(pObject!=NULL){pObject->Release();pObject=NULL;}
#define SafeDelete(p) {if(p) {delete (p); (p)=NULL;}}//删除对象
#define SafeDeleteArray(p) {if(p) {delete[] (p); (p)=NULL;}}//删除数组对象

已经说的很明确了,第一个是删除对象,第二上是删除变量,第三个是删除数组变量
换个头像,看见广告就眼红,直接封ID。

TOP

:L 我只是想知道为什么有的可以删除有的不行呢?
例如这个摄像机类里的私有成员为什么都不能删除呢?
class Camera
{
public:
       
        Camera();
        Camera(CameraType cameraType);                                                // 重载构造器
        ~Camera();                                                                                        // 析构器

        void strafe(float units);                                                        // 左右移动
        void fly(float units);                                                                // 上下移动
        void walk(float units);                                                                // 前后移动
       
        void pitch(float angle);                                                        // 倾斜(绕right向量,x轴)
        void yaw(float angle);                                                                // 偏航(绕up向量,y轴)
        void roll(float angle);                                                                // 滚转(绕look向量,z轴)

        //void

        void getViewMatrix(D3DXMATRIX* V);                                        // 取得 摄像机视矩阵
        void setCameraType(CameraType cameraType);                        // 设置 摄像机的类型(人、飞行器)
        void getPosition(D3DXVECTOR3* pos);                                        // 取得 摄像机位置
        void setPosition(D3DXVECTOR3* pos);                                        // 设置 摄像机位置

        void getRight(D3DXVECTOR3* right);                                        // 取得 左右方向 移动的向量
        void getUp(D3DXVECTOR3* up);                                                // 取得 上下方向 移动的向量
        void getLook(D3DXVECTOR3* look);                                        // 取得 前后方向 移动的向量

        DWORD getCameraType( void );
private:
        CameraType  _cameraType;                                                       
        D3DXVECTOR3 _right;                                                                        // 保存 左右方向 移动的向量
        D3DXVECTOR3 _up;                                                                        // 保存 上下方向 移动的向量
        D3DXVECTOR3 _look;                                                                        // 保存 前后方向 移动的向量
        D3DXVECTOR3 _pos;                                                                        // 保存 摄像机位置
};

TOP

你的私有变量在哪里删除?是删除Camera吗?应当使用SafeRelease
换个头像,看见广告就眼红,直接封ID。

TOP

...实验出来了。。。嘻嘻,,谢谢老大了

我一直一个错误的理解,现在算是清晰了
对象在调用的类中析构,在本身类中只析构本身的调用的对象,传进来的还需要原来的类中析构。
析构只是析构对象与指针。普通变量不用析构。
链表析构要单个进行析构。
由于写的宏中判断是(对象==NULL),若不小心调用了Release方法没有进行(对象=NULL)调用那个宏析构的时候,操作也会出问题。。    

TOP

从VB转到其他语言,确定容易搞错=和==
换个头像,看见广告就眼红,直接封ID。

TOP

发新话题