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;
}

これは私のためにクラッシュします

delete[] pFoo;

VirtualAlloc が原因でこれがクラッシュしていることはわかっていますが、これを修正する方法がわかりません...

4

3 に答える 3

1

同じ変数を使用しています。したがって、最初の割り当てがリークされます。

で解放するとVirtualFree、ポインターは無効になります。そのdeleteため、未定義です。

さらに:

混合することはできません。同じ理由で、 と混合することもできVirtualAllocません。deletemallocdelete

于 2011-10-10T02:02:48.790 に答える
1
unsigned char* pFoo = new unsigned char[1000];

pFoo動的メモリへのポインタを保持するようになりました。

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

これにより古いポインタが上書きされ、1000char配列がリークされます。

試す:

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;
于 2011-10-10T02:05:25.703 に答える
1

new/delete または VirtualAlloc/VirtualFree を使用します。2 つの別個のメモリ ブロックを割り当て、pFoo を使用して両方を参照し (もちろん一度に 1 つしか参照できない場合)、pFoo を使用して 2 つの空き関数を呼び出します。それらの1つは失敗するでしょう:)

于 2011-10-10T02:05:55.530 に答える