CVIew::hanshu()
{
CClass *p=New CClass()
}
我发觉会delete时出错

解决方案 »

  1.   

    CClass *p=New CClass()[1]
    delete []p
      

  2.   

    CVIew::hanshu()
    {
    CClass *p=New CClass()

    delete (p);}
      

  3.   

    CVIew::hanshu()
    {
    CClass *p=New CClass()
    //做其它事情
    delete p;
    p = NULL;
    }
      

  4.   

    这个CClass释放资源的地方正确么?
      

  5.   

    delete后就不能再使用该指针了,否则当然会错,另一个问题,就是delete后要将指针设为NULL,否则会出现野指针,很容易出错的。
      

  6.   

    CVIew::hanshu()
    {
    CClass *p=New CClass()
    //做其它事情
    delete p;
    p = NULL;
    }
    同意
    或者你就不用指针了,程序自己控制删除。
      

  7.   

    请问cici2006(cici_2006)你说的----> 或者你就不用指针了,程序自己控制删除。
    程序自己控制删除是在析构函数中还是指的其他?????
      

  8.   

    请问cici2006(cici_2006)你说的----> 或者你就不用指针了,程序自己控制删除。
    程序自己控制删除是在析构函数中还是指的其他?????
    ------------------------------------
    这里的p指针是局部变量,必须在创建它的函数中释放,否则就会有内存泄漏
      

  9.   

    下面这个不可以在函数内释放呀?
    BOOL CDockPageBar::AddPage(CWnd *pWnd, LPCTSTR sText, UINT IconID)
    {
    ASSERT(IsWindow(pWnd->m_hWnd));
    CPageItem *pItem;//该指针要delete掉吗
    pItem = new CPageItem();
    pItem->m_pWnd = pWnd;
    pItem->m_pWnd->SetParent (this);
    pItem->m_strLabel = sText;

    CClientDC dc(this);
    HFONT oldFont = (HFONT)dc.SelectObject(m_font);
    pItem->m_uiTabWidth = dc.GetTextExtent (sText).cx;
    dc.SelectObject(oldFont); if(IconID)
    {
    pItem->m_hIcon = AfxGetApp()->LoadIcon(IconID);
    pItem->m_uiTabWidth += 18;
    }
    else
    pItem->m_hIcon = NULL; pItem->m_uiTabWidth += 9; if(pWnd)
    {
    CRect rect;
    //hubin  2004-6-28
    pWnd->GetClientRect(rect);
    int cx=rect.Width();
    int cy=rect.Height();
    CWnd::GetClientRect(rect);
    cx-=rect.Width();
    cy-=rect.Height();
    if(cx<=0)
    cx=0;
    if(cy<=0)
    cy=0;
    if(cx>0 || cy>0)
    {
    GetWindowRect(rect);
    GetParent()->ScreenToClient(&rect);
    rect.right+=cx;
    rect.bottom+=cy;
    MoveWindow(rect);
    CSize newsize(rect.Width(),rect.Height()+ITEMBUTTON_HEIGHT);
        m_szHorz = m_szVert = m_szFloat = newsize; }
    //////////////////////////;
    GetClientRect(rect, m_PageList.GetCount()>1?TRUE:FALSE);
    pWnd->MoveWindow(rect);
    pWnd->ShowWindow(SW_HIDE);
    } m_PageList.AddTail(pItem);
    UpdateWindow();
    //但是delete pItem会导致错误
    return TRUE;
    }
     
      

  10.   

    分配在堆上的内存都需要释放。
    这种new出来的对象一般都在堆上。在你不再需要这个对象的地方释放即可,注意不可超越指针变量申明的域,除非还有指针指向它。
      

  11.   

    在删除之前,加一行代码:pItem->m_pWnd = NULL
      

  12.   

    if(p)
    {
       delete p;
       p = null;
    }
      

  13.   

    (1)所有new出来的东西都需要delete
    (2)不是 所有由"你"的代码new出来的对象,都必须由"你"的代码delete.
    (3)pItem = new CPageItem();
       delete出错,是因为m_PageList还在用pItem呢,怎么能删除
       在delete前加上PageList.RemoveAll()就不会出错了。
      

  14.   

    既然你记录了pItem指针,就没必要一定在该函数结束时将其delete掉。
    可以在应用程序不用到该指针时,delete掉PageList里记录的内容,同时清空PageList。
      

  15.   

    其实new出来的东西归根到底都是要delete的,只不过是在你再也用不到的时候delete。只要找准时机就行了。
      

  16.   

    好像有时在某一函数中的指针没办法在该函数中DELETE
    怎样判别呢?不可以在函数以外的地方delete掉呀
      

  17.   

    我按照freemme(路在脚下)的方法删除pItem->m_pWnd = NULL
    delete pItem;
    在上面那个函数中没有问题,可是在UpdateSize()函数中就会有问题
    特别是在
    if(pItem->m_pWnd)
    pItem->m_pWnd->MoveWindow(ClientRect);//此处
    如果我在上面函数中不用指针,用类对象,也是出现同样的问题
    请高手们解决!
    void CDockPageBar::UpdateWindow()
    {
    UpdateSize();
    if(m_nActivePage < 0)
      SetActivePage(0);
      Invalidate(FALSE);
    }
    void CDockPageBar::UpdateSize()
    {
    UINT PageCount = m_PageList.GetCount();
    if(PageCount < 1) return; CPageItem *pItem;//=new CPageItem;
    CRect rect,ClientRect,ItemRect;

    if(PageCount == 1) 
    {
    GetClientRect(ClientRect, FALSE);
    pItem = (CPageItem*)GetPageItem(0);
    if(pItem->m_pWnd)
    {
    pItem->m_pWnd->MoveWindow(ClientRect);
    pItem->m_pWnd->ShowWindow(SW_SHOW);
    }
    return;
    } POSITION pos; GetClientRect(rect, FALSE);
    rect.left += 6;
    rect.right -= 6;
    rect.bottom -= 3; // 2004/03/28 增加对Pager bar放置位置的可选支持(目前只有顶部和底部可选)
    if (ATPAGER(m_dwPagerStyle)) //如果位于顶部
    {
    rect.top += 1;
    rect.bottom = rect.top + ITEMBUTTON_HEIGHT - 2;
    }
    else
    {
    rect.bottom -= 1;
    rect.top = rect.bottom - ITEMBUTTON_HEIGHT + 2;
    } GetClientRect(ClientRect, TRUE); ItemRect = rect;
    int AreaWidth = 0,ItemWidth,ItemIndex=0; for(pos=m_PageList.GetHeadPosition();pos!=NULL;ItemIndex++)
    {
    pItem=(CPageItem*)m_PageList.GetNext(pos);
    // if(pos!=0x00000000)
    {
    // CString strTemp=pItem->m_strLabel;
    if(pItem)
    {
    ItemWidth = pItem->m_uiTabWidth;
    AreaWidth += ItemWidth;
    ItemRect.right = ItemRect.left+ItemWidth-1;
    pItem->m_rtLabel = ItemRect;
    ItemRect.left = ItemRect.right + 1;
    if(pItem->m_pWnd)
    pItem->m_pWnd->MoveWindow(ClientRect);
    }
    } } if(AreaWidth > rect.Width())
    {
    ItemRect = rect;
    int AreaWidth,MaxWidth = rect.Width()/PageCount;
    for(pos=m_PageList.GetHeadPosition();pos!=NULL;)
    {
    pItem=(CPageItem*)m_PageList.GetNext(pos);
    if(pItem)
    {
    AreaWidth = pItem->m_uiTabWidth;
    ItemWidth = (MaxWidth < AreaWidth)?MaxWidth:AreaWidth;
    ItemRect.right = ItemRect.left+ItemWidth;
    pItem->m_rtLabel = ItemRect;
    ItemRect.left = ItemRect.right + 1;
    }
    }
    }}
      

  18.   

    To hafoo(VC低手):
    首先要弄清楚这些代码为什么会在这里,是用来做什么的,然后再去尝试如何进行加工处理。不要在你没看懂代码之前就随便修改别人的代码,读懂别人的代码不是一件容易的事。-------------------------------------------------------
    MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)  
    可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
    下载地址:http://nj.onlinedown.net/soft/6591.htm
      

  19.   

    应该来说。那个内存问题是很明显的呀,应该要修改过来
    关键是upsize和前面的AddPage的值没有调用关系,为什么不可以改呢?
    有没有很好的解决方案