BvcmCorrectLineCellCtr* m_cellUp;
m_cellUp = new BvcmCorrectLineCellCtr(m_upperPoint->GetSize(), m_manager,
m_appName, ID_TMPL_CORPAIR_UP, BvcmEDIT_MAX, this);
....delete m_cellUp;
m_cellUp = NULL;m_cellUp = new BvcmCorrectLineCellCtr(m_upperPoint->GetSize(), m_manager,
m_appName, ID_TMPL_CORPAIR_UP, BvcmEDIT_MAX, this);这样写对吗?

解决方案 »

  1.   

    含有需要删除的指针、链表、GDI资源的当然要删除。道理都一样!
      

  2.   

    删除后我的程序出错了,在下次 new 并执行到GetWindowRect(rect1)时;
      

  3.   

    BOOL FcBvcmCorrectPairPage::OnInitDialog() 
    {
    BvcmCmdCorrectPage::OnInitDialog();

    CRect rct;
    m_cLayer.GetWindowRect(&rct);
    ScreenToClient(&rct);
    m_cFixLayer.MoveWindow(&rct); //##FCCMTL##00000040##FCCMTL##
    BvsPalette palette;
    palette.GetFromCad(m_manager);
    BvsPen pen;
    pen.GetFromCad(m_manager);
    BvsLayer layer;
    layer.GetFromCad(m_manager.Data());
    const BvsCoordinatesTable& table = m_manager.Data().CoordinatesTable();

    m_cLayer.Init(layer, palette);
    m_cPen.Init(pen, palette);
    m_cLevel.Init(table, palette); if (m_manager.IsKeisansho()) {
    GetDlgItem(IDC_LAYER_TITLE)->EnableWindow(FALSE);
    m_cLayer.EnableWindow(FALSE);
    GetDlgItem(IDC_LEVEL_TITLE)->EnableWindow(FALSE);
    m_cLevel.EnableWindow(FALSE);
    } //##FCCMTL##00000041##FCCMTL##
    ASSERT(NULL == m_cellUp);
    ASSERT(NULL == m_cellLw);
    if (!IsFCom()) {
    m_cellUp = new BvcmCorrectLineCellCtr(m_upperPoint->GetSize(), m_manager,
    m_appName, ID_TMPL_CORPAIR_UP, BvcmEDIT_MAX, this);
    m_cellLw = new BvcmCorrectLineCellCtr(m_lowerPoint->GetSize(), m_manager,
    m_appName, ID_TMPL_CORPAIR_LW, BvcmEDIT_MAX, this); ASSERT(NULL != m_cellUp);
    ASSERT(NULL != m_cellLw); CWnd* pStc1 = GetDlgItem(IDC_CORPAIR_STC_CELL1);
    CWnd* pStc2 = GetDlgItem(IDC_CORPAIR_STC_CELL2);
    CRect rect1, rect2;
    pStc1->GetWindowRect(rect1);
    pStc2->GetWindowRect(rect2);
    ScreenToClient(rect1);
    ScreenToClient(rect2); if (!m_cellUp->Create(rect1, IDC_CORPAIR_STC_CELL1)) {
    ASSERT(FALSE);
    return FALSE;
    }
    if (!m_cellLw->Create(rect2, IDC_CORPAIR_STC_CELL2)) {
    ASSERT(FALSE);
    return FALSE;
    }

    m_cellUp->SetWindowPos(pStc1, 0, 0, 0, 0,
    SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOZORDER);
    m_cellLw->SetWindowPos(pStc2, 0, 0, 0, 0,
    SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOZORDER); pStc1->DestroyWindow();
    pStc2->DestroyWindow(); m_cellUp->SetVal(*m_upperPoint, m_nLevel);
    m_cellLw->SetVal(*m_lowerPoint, m_nLevel);
    } UpdateData(FALSE);
    SwitchLayerCtrl(); if (m_manager.DM_ExistAdmin()) {
    //##FCCMTL##00000042##FCCMTL##
    //##FCCMTL##00000043##FCCMTL##
    } else {
    //##FCCMTL##00000044##FCCMTL##
    //##FCCMTL##00000045##FCCMTL##
    //##FCCMTL##00000046##FCCMTL##
    //##FCCMTL##00000047##FCCMTL##
    GetDlgItem(IDC_CORPAIR_SLOPE_DIVIDE  )->ShowWindow(SW_HIDE);
    GetDlgItem(IDC_CORPAIR_SLOPE_POSFRAME)->ShowWindow(SW_HIDE);
    GetDlgItem(IDC_CORPAIR_SLOPE_POSUPPER)->ShowWindow(SW_HIDE);
    GetDlgItem(IDC_CORPAIR_SLOPE_POSLOWER)->ShowWindow(SW_HIDE);
    }
    OnSlopeAdd();
    UpdateCadImage(0, 0, true); return TRUE;
    }
      

  4.   

    if (m_cellUp != NULL) {
    delete m_cellUp;
    m_cellUp = NULL;
    }
    if (m_cellLw != NULL) {
    delete m_cellLw;
    m_cellLw = NULL;
    }OnInitDialog(); //@xyc041028
      

  5.   

    如果不删除指针,如下就不会出错
    m_cellUp = NULL;
    m_cellLw = NULL;
    OnInitDialog(); //@xyc041028
      

  6.   

    oyljerry(☆勇敢的心☆-要开始写论文了) :
    换个名字是什么意思,因为我这里指向同一个列表,只是列表里的东西变了,要让他再生成一次。
      

  7.   

    to  yuantao(cfan):
    假如:因为列表里是别人的类啊,没有接口所以有能直接修改啊
      

  8.   

    要解决你的疑惑,就要明白new的用法:
    new顾名思义是申明变量时才使用,因而new 了之后就不能再new了:比如一个孩子出生了就不能让他再出生一次。
      

  9.   

    续:指针的重新定位(new的用法)
    既然不能用new将指针重新定位,那么该怎么做?
    1、大家都知道的方法:
    Class A;
    A* p = new A(...);
    //..
    A ATemp = ...;
    p = &A;2.使用auto_ptr
    auto_ptr< A > pi( new A( ... ) );
    //重新定位
    p_auto_int.reset( new A( ... ) );
      

  10.   

    楼上最后一句应该是:
    auto_ptr.reset( new A( ... ) ); //呵呵,开始本来想用int 做例子的 :)
      

  11.   

    to I_Love_CPP:请教一下
    A* p = new A(...);
    你这里有一个new ,不需要删除吗?
      

  12.   

    如果不删除指针,如下就不会出错
              m_cellUp = NULL;
     m_cellLw = NULL;
     OnInitDialog(); //@xyc041028
      

  13.   

    没有什么好犹豫的
    new分配的,使用后都要用delete删除