我定义了如下结构体:
struct OriginalGcp
{
double   *pGcp_Px,  *pGcp_Py,  *pGcp_Gx,  *pGcp_Gy,  *pGcp_Gz;  //控制点指针
};
在某个函数中,定义结构体变量如下:
OriginalGcp  m_op1;m_op1.pGcp_Px=new double [10];
m_op1.pGcp_Py=new double [10];
……
……
……成员有很多,我只是列出了几个指针变量。
然后这个函数结束之后,我该如何释放这个结构体变量m_op1 ?

解决方案 »

  1.   

    要将 m_op1  中的每一个成员 pGcp_Px、pGcp_Py等都delete
      

  2.   

    delete []m_op1.pGcp_Px;
    一个个释放
      

  3.   

    delete []m_op1.pGcp_Px;
    delete []m_op1.pGcp_Py;
    delete []m_op1.pGcp_Gx;
    delete []m_op1.pGcp_Gy;
    delete []m_op1.pGcp_Gz;在确定不需要继续使用后,运行上述代码。最好放在析构函数中
      

  4.   

    增加构造/析构函数,在构造函数里面申请内存
    析构函数里面释放
    class COriginalGcp : public OriginalGcp
    {
        public:
            COriginalGcp()
            {
                pGcp_Px = new double [10];
                pGcp_Py = new double [10];
                pGcp_Gx = new double [10];
                pGcp_Gy = new double [10];
                pGcp_Gz = new double [10];
            }
            ~COriginalGcp()
            {
                delete[] pGcp_Px;
                delete[] pGcp_Py;
                delete[] pGcp_Gx;
                delete[] pGcp_Gy;
                delete[] pGcp_Gz;
            }
    }
      

  5.   

    增加构造/析构函数,在构造函数里面申请内存
    析构函数里面释放
    class COriginalGcp : public OriginalGcp
    {
        public:
            COriginalGcp()
            {
                pGcp_Px = new double [10];
                pGcp_Py = new double [10];
                pGcp_Gx = new double [10];
                pGcp_Gy = new double [10];
                pGcp_Gz = new double [10];
            }
            ~COriginalGcp()
            {
                delete[] pGcp_Px;
                delete[] pGcp_Py;
                delete[] pGcp_Gx;
                delete[] pGcp_Gy;
                delete[] pGcp_Gz;
            }
    };
    结尾忘了;
      

  6.   

    你说的对,由于我在函数中定义了一个结构体变量 OriginalGcp m_op1;由于是函数内部局部变量,所以函数运行结束之后,这个结构体变量m_op1就自动销毁,对吧?但是结构体变量m_op1 用new开辟的空间依然存在,所以需要人为释放。我觉得你这个构造函数没有必要申请,因为根据不同的需求申请不同的空间,不一定是10,应该在构造函数中写:pGcp_Px =NULL;pGcp_Py =NULL;…… 对吧。
      

  7.   

    如果在函数体内,我不是定义一个结构体变量,而是定义了一个结构体指针,如下:
    OriginalGcp  *m_op1=new OriginalGcp;
    然后对成员变量开辟空间如下:
    m_op1->pGcp_Px=new double [10];
    m_op1->pGcp_Py=new double [10];
    ……最后函数运行结束时,运行如下代码:
    delete m_op1;是不是就可以了?
      

  8.   

    理论上可以。只是不符合我个人习惯。我个人习惯显示释放。
    delete/new会调用相应的析构函数/构造函数。
    free/malloc不会调用析构函数/构造函数、
      

  9.   


    你在构造里面把所有指针NULL
    析构里面判断所有指针不为NULL则自动释放就可以了我自己用的一个自动释放结构体的class:
    template <class T>
    class CSafeSaveClass
    {
    public:
    T* This; CSafeSaveClass()
    {
    This = NULL;
    };
    CSafeSaveClass(T* Type)
    {
    This = Type;
    };
    ~CSafeSaveClass()
    {
    if(This)
    delete This;
    };
    void Attach(T* Type)
    {
    if(!This)
    This = Type;
    };
    void Release()
    {
    if(This)
    {
    delete This;
    This = NULL;
    }
    }
    };// 通过成员变量This指针访问元素
      

  10.   

    如果这个结构体使用频繁,建议写一个专门释放内存的freeResouce函数 里面全是delete p
      

  11.   

    如果结构体有析构函数就可以这样写,
    否则还需要delete掉成员中new出来的空间。