2011-10-10 27 views
0
#include <Windows.h> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    unsigned char* pFoo = new unsigned char[1000]; 

    pFoo = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 

    VirtualFree(pFoo, 0, MEM_RELEASE); 

    delete[] pFoo; 

    cin.ignore(); 
    cin.get(); 

    return 0; 
} 

這崩潰,我在新建/刪除[]和的VirtualAlloc

delete[] pFoo; 

我知道這是因爲的VirtualAlloc的崩潰,但我不知道如何解決這個問題?

回答

1

你正在使用相同的變量。所以你的第一個分配被泄漏。

當你用VirtualFree釋放它後,指針無效。所以delete就沒有定義。

此外:

你不能因爲你不能用delete混合malloc同樣的原因,混合VirtualAllocdelete

+0

所以它只是VirtualFree(pFoo,0,MEM_RELEASE);足夠? – replicant

+0

那麼,主要問題是你有兩個不同的分配去同一個變量。第二次分配將覆蓋第一個指針。然後你嘗試釋放/釋放它兩次。 – Mysticial

+0

可以解釋你想用兩個分配來完成什麼?或者你是在誤解某些東西? – Mysticial

1
unsigned char* pFoo = new unsigned char[1000]; 

現在pFoo包含一個指向動態內存的指針。

pFoo = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 

這將覆蓋舊指針,1000 char數組被泄漏。

嘗試:

unsigned char* pFoo = new unsigned char[1000]; 
unsigned char* pBar = (unsigned char*)VirtualAlloc(NULL, 1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
VirtualFree(pBar, 0, MEM_RELEASE); 
delete[] pFoo; 
1

或者使用新/刪除或的VirtualAlloc/VirtualFree。您正在分配兩個單獨的內存塊,使用pFoo來引用這兩個內存塊(當然,它一次只能引用一個內存塊),然後使用pFoo調用兩個免費函數。其中一個將失敗:)