【发布时间】:2017-12-04 03:10:55
【问题描述】:
我想使用 windows api 调用GetWriteWatch()。此方法采用我在堆栈上分配的void* 数组,如下所示:void* lpAddresses[PAGE_COUNT];
现在的问题是,PAGE_COUNT 需要很大,这会导致堆栈溢出。
我如何写这个来分配堆上的内存?
我试过了:
void* lpAddresses = ::operator new[](PAGE_COUNT);
void* lpAddresses = ::operator new(PAGE_COUNT);
void* lpAddresses = malloc(PAGE_COUNT*sizeof(void*));
但这会导致来自GetWriteWatch()的错误代码
有效的堆栈版本:
ULONG_PTR lpdwCount = PAGE_COUNT;
void *lpAddresses[PAGE_COUNT];
ULONG lpdwGranularity;
UINT result = GetWriteWatch(WRITE_WATCH_FLAG_RESET, m_rawMemory.as_void, m_alloc_size, lpAddresses, &lpdwCount, &lpdwGranularity);
谢谢
【问题讨论】:
-
在堆上分配数组后如何调用
GetWriteWatch?为什么不包含在问题中? -
void* lpAddresses[PAGE_COUNT]是一个void*指针数组。new[]等效于void** lpAddresses = new void*[PAGE_COUNT];,或者更好的是std::vector<void*> lpAddresses(PAGE_COUNT); -
GetWriteWatch 的结果!= 0。是的,我用 & then 传递了它。还是没有运气。
-
不,不,不!我的错。如果您使用
malloc版本,则必须通过(PVOID *) lpAddresses。不是&lpAddresses。传递&lpAddresses是绝对错误的。 -
@RemyLebeau 如果您可以将其发布为答案,我将接受此作为答案。谢谢你。两个版本都可以。
标签: c++ winapi memory-management allocation