2011-10-10 1 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은 정의되지 않았습니다. 또한

:

당신은 당신이 deletemalloc을 혼합 할 수 없습니다 같은 이유로 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를 사용하여 두 개의 자유 함수를 호출 할 수 있습니다. 그 중 하나가 실패 할 것입니다 :)