New/delete[] and VirtualAlloc
New/delete[] and VirtualAlloc
#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,但我不知道如何解决这个问题…
您使用相同的变量。所以你的第一个分配被泄露了。
使用VirtualFree
释放后,指针无效。所以delete
是未定义的
此外:
不能将VirtualAlloc
和delete
混合,就像不能将malloc
和delete
混合一样。
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;
使用new/delete或VirtualAlloc/VirtualFree。您正在分配两个独立的内存块,使用pFoo来引用这两个内存块(当然,它一次只能引用一个内存块),然后使用pFoo调用两个空闲函数。其中一个会失败:)
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- 了解 VirtualAlloc 中的基址
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- New/delete[] and VirtualAlloc