2014-04-05 148 views
0

我目前正試圖刪除由cocos2dx返回的緩衝區,但其崩潰在這裏是我的代碼 我從cocos2dx獲取文件數據,然後保存它的指針後,我現在在末尾添加空字符當我嘗試刪除該緩衝區項目崩潰刪除無符號字符*緩衝區

unsigned long fSize = 0; 

unsigned char* pBuff = (cocos2d::CCFileUtils::sharedFileUtils()->getFileData(szName, "r", &fSize)); 

int result = 0; 
if(pBuff) 
{ 
    result = 1; 
    pBuff[fSize] = '\0'; 
} 
delete pBuff; //crashing at this line 

實施getFileData的是

unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode,  
unsigned long * pSize) 
{ 
    unsigned char * pBuffer = NULL; 
    CCAssert(pszFileName != NULL && pSize != NULL && pszMode != NULL, "Invalid parameters."); 
    *pSize = 0; 
    do 
{ 
    // read the file from hardware 
    std::string fullPath = fullPathForFilename(pszFileName); 
    FILE *fp = fopen(fullPath.c_str(), pszMode); 
    CC_BREAK_IF(!fp); 

    fseek(fp,0,SEEK_END); 
    *pSize = ftell(fp); 
    fseek(fp,0,SEEK_SET); 
    pBuffer = new unsigned char[*pSize]; 
    *pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp); 
    fclose(fp); 
} while (0); 

if (! pBuffer) 
{ 
    std::string msg = "Get data from file("; 
    msg.append(pszFileName).append(") failed!"); 

    CCLOG("%s", msg.c_str()); 
} 
return pBuffer; 

}

編輯:改變(由大衛的建議)

if(pBuff) 
{ 
    result = 1; 
    pBuff[fSize] = '\0'; 
} 
delete pBuff; //crashing at this line 

if(pBuff) 
{ 
    result = 1; 
    //pBuff[fSize] = '\0'; 
    delete[] pBuff; //still crashing at this line 
} 

後它仍然會崩潰,

+0

'pBuff [fSize] ='\ 0';'超出範圍。我認爲,返回分配的內存是不好的設計(使用std :: shared_ptr/std :: unique_ptr代替)。 'do ... while(0)'是毫無意義的(只是使用'{...}') –

+0

@DieterLücking這就是我的想法,但OP有點幸運,只是添加一個nul字符實際上會產生錯誤?如果是我,我可以保證它可以在測試中工作,並在交付後產生間歇性故障:) –

+0

getFileData代碼來自cocos2dx遊戲引擎。 刪除pBuff [fSize] ='\ 0'並使用delete [] pBuff無法解決我已更新我的帖子的問題 –

回答

1

你正在編寫超出緩衝區結束了:

pBuff[fSize] = '\0'; 

您撥打delete錯誤。它需要匹配new的呼叫。

delete[] pBuff; 

就我個人而言,我不明白你爲什麼會在這裏使用原始內存分配。在這種情況下使用標準容器std::vector<unsigned char>不是更好嗎?或者,如果由於某種原因您必須使用原始內存分配,那麼至少將內存換成智能指針。


你說在解決這些問題後,你的代碼仍然不能通過delete。這聽起來像是你在其他地方損壞了堆。

+0

在您提出更改之後,它仍然崩潰 –

+0

getfiledata代碼不是來自cocos2dx遊戲引擎 –

+0

您可能正在損壞其他地方的堆。 –