2015-12-06 66 views
-9

我使用,使PTEMP輸出的代碼時:崩潰使用delete []刪除指針

if (m_pTImgFrame != NULL) 
{ 
    for (int i = 0; i < m_nFrameNumber; i++) 
    { 
     TImage* pTemp = (TImage*)m_pTImgFrame[i]; 
     if (pTemp != NULL) 
     { 
      TCHAR buffer[256] = { 0 }; 
      _stprintf_s(buffer, 256, _T("%d,%d,%d,%d,%d,%d,%d,%d\n"), 
       pTemp->attrib, 
       pTemp->h, 
       pTemp->pitch, 
       pTemp->w, 
       pTemp->data[0], 
       pTemp->data[1], 
       pTemp->data[2], 
       pTemp->data[3]); 
      OutputDebugString(buffer); 

      delete[] pTemp; 
      m_pTImgFrame[i] = NULL; 
     } 
    } 
    delete []m_pTImgFrame; 
    m_pTImgFrame = NULL; 
} 

起源代碼仍然崩潰

if (m_pTImgFrame != NULL) 
{ 
    for (int i = 0; i < m_nFrameNumber; i++) 
    { 
     BYTE* pTemp = (BYTE*)m_pTImgFrame[i]; 
     if (pTemp != NULL) 
     { 
      delete[] pTemp; 
      m_pTImgFrame[i] = NULL; 
     } 
    } 
    delete []m_pTImgFrame; 
    m_pTImgFrame = NULL; 
} 

聲明變量:

typedef unsigned int  UINT; 
typedef struct _TImage 
{ 
    int w;   
    int h;   
    int pitch;  
    int attrib;  
    unsigned char data[4]; 
} TImage; 

UINT  m_nFrameNumber;  
UINT*  m_pnFrameDelay;  
TImage** m_pTImgFrame; 

PBITMAPINFOHEADER pbih; 
typedef struct tagBITMAPINFOHEADER{ 
    DWORD  biSize; 
    LONG  biWidth; 
    LONG  biHeight; 
    WORD  biPlanes; 
    WORD  biBitCount; 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG  biXPelsPerMeter; 
    LONG  biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER; 

分配:

m_pTImgFrame = new TImage*[1]; 
    m_pTImgFrame[0] = (TImage*)new BYTE[sizeof(TImage) - 4 + 4 * width * pbih->biHeight]; 
    m_pTImgFrame[0]->attrib = imageAttrib8888; 
    m_pTImgFrame[0]->w = width; 
    m_pTImgFrame[0]->h = pbih->biHeight; 
    m_pTImgFrame[0]->pitch = 4 * width; 
    LOG(_T("32width=%d, height=%d"), width, pbih->biHeight); 
    for(j=pbih->biHeight-1; j>=0; j--) 
    { 
     int indexDst = (pbih->biHeight-j-1) * width * 4; 
     //int indexSrc = j * pbih->biWidth * 4; 
     int indexSrc = j * ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8/*bmpInfo.bmWidthBytes*/; 
     for(i=0; i< width; i++) 
     { 
      m_pTImgFrame[0]->data[indexDst++] = lpBits[indexSrc++]; 
      m_pTImgFrame[0]->data[indexDst++] = lpBits[indexSrc++]; 
      m_pTImgFrame[0]->data[indexDst++] = lpBits[indexSrc++]; 
      m_pTImgFrame[0]->data[indexDst++] = 255; 
      indexSrc++; 
     } 
    } 

運行線 delete [] pTemp如果m_nFrameNumber爲1時,該代碼就會崩潰(我只看到了事故發生時,它是1,但我不知道)的每個值的輸出pTemp是正確的,那爲什麼它崩潰?

+0

請參閱[如何提出一個好問題?](http://stackoverflow.com/help/how-to-ask)。發佈代碼圖片並不好。郵政編碼。 –

+0

如果你刪除了一些內存,你肯定已經新增了內存,但是在代碼中看不到任何新內存。 – pointer

+0

@RSahu我發佈了代碼的圖片,因爲有一個自動窗口,所以變量的值將在運行崩潰行之前顯示在其上。對於任何使用Visual Studio的人來說,我認爲它比純代碼好得多。 – zzy

回答

0

運行線delete [] pTemp時的代碼將崩潰,如果m_nFrameNumber1

鑑於你剛纔說什麼,該分配如下:

m_pTImgFrame = new TImage*[1];

m_pTImgFrame唯一有效的索引是0,因爲您只分配給e該陣列的尺寸爲1。嘗試訪問m_pTImgFrame[1]是未定義的行爲。

其次,您的新運算符需要與類型和標量的刪除運算符相匹配。

您分配作爲字節數組:

m_pTImgFrame[0] = (TImage*)new BYTE[sizeof(TImage) - 4 + 4 * width * pbih->biHeight]; 

爲此解除分配元素正確的方法是這樣的:

BYTE* allocation = (BYTE*)m_pTImgFrame[0]; 
delete [] allocaiton; 

這是錯誤的:

TImage* pTemp = (TImage*)m_pTImgFrame[i]; 
    if (pTemp != NULL) 
    { 
     ... 
     delete[] pTemp; // deleting as an array of TImage, when it should be deleted as an array of bytes 
    } 

無關切線基於yoru代碼 - 在調用delete之前,不需要檢查NULL。總是可以安全地說delete NULL。總是會。

+0

在此先感謝,BYTE *鑄造用於首先崩潰的原始代碼,因此我重寫代碼以輸出「pTemp」的值。 m_nFrameNumber是1不能讓我是1,所以m_pTImgFrame [0]是我想的安全。 – zzy

+0

最後,它是由vs2015項目中使用vc6編譯的dll引起的。 – zzy