Windows堆栈

堆的物理存储器来自页交换文件。

进程默认堆

1堆在进程的地址空间上。

2.默认情况下,进程堆的大小为1MB.

3.动态链接库是没有所谓的进程默认堆。

4.获取进程的默认堆的函数 getprocessheap

额外堆

1.创建额外堆  HeapCreate

HANDLE WINAPI HeapCreate(

__in DWORD flOptions,

__in SIZE_T dwInitialSize,

__in SIZE_T dwMaximumSize );

第一个参数flOptions用于修改如何在堆栈上执行各种操作。你可以设定0、HEAP_NO_SERIALIZE、HEAP_GENERATE_EXCEPTIONS、HEAP_CREATE_ENABLE_EXECUTE或者是这些标志的组合。

HEAP_NO_SERIALIZE:对堆的访问是非独占的,如果一个线程没有完成对堆的操作,其它线程也可以进程堆操作,这个开关是非常危险的,应尽量避免使用。

HEAP_GENERATE_EXCEPTIONS:当堆分配内存失败时,会抛出异常。如果不设置,则返回NULL。

HEAP_CREATE_ENALBE_EXECUTE:堆中存放的内容是可以执行的代码。如果不设置,意味着堆中存放的是不可执行的数据

dwInitialSize:一开始调拨给堆的字节数。

dwMaximumSize :堆等增长到最大大小。如果dwMaximumSize  = 0,表示没有指定上限。

从堆分配内存块HeapAlloc

LPVOID HeapAlloc(

HANDLE hHeap,

DWORD dwFlags,

SIZE_T dwBytes,

);

hHeap:要分配堆的句柄,可以通过HeapCreate()函数或GetProcessHeap()函数获得

dwFlags:

意义

HEAP_GENERATE_EXCEPTIONS

如果分配错误将会抛出异常,而不是返回NULL。异常值可能是STATUS_NO_MEMORY, 表示获得的内存容量不足,或是STATUS_ACCESS_VIOLATION,表示存取不合法。

HEAP_NO_SERIALIZE

不使用连续存取。

HEAP_ZERO_MEMORY

将分配的内存全部清零。

dwBytes:要分配堆的字节数。

调整内存块的大小

LPVOID HeapReAlloc(

HANDLE hHeap,

DWORD dwFlags,

LPVOID  pvMem,

SIZE_T pvMem,

);

dwFlags:

HEAP_ZERO_MEMORY:只有增大内存块时才有用,减小不起作用。

HEAP_REALLOC_IN_PLACE_ONLY 不要移动内存块,如果不移动也能增大则返回原来的地址。

pvMem:内存块当前的地址

pvMem:新的大小

获取内存块的大小

SIZE_T  heapszie{

HANDLE hHeap;

DWORD fdwFlags;

LPCVOID  pvMen);

fdwFlags:可以是0或者HEAP_NO_SERIALIZE

释放内存块

BOOL HeapFree(

HANDLE hHeap,

DWORD fdwFlags,

LPVOID lpMem

)

fdwFlags:可以是0或者HEAP_NO_SERIALIZE

销毁堆 heapdestroy

释放所有的内存块,系统回收占用的物理存储器和地址空间区域。

不允许在进程终止前,销毁进程的默认堆。

引申到c++操作符 new和delete的使用。

对比c运行库函数malloc 和 free

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
_roi_buf_id, 1); if (status != VA_STATUS_SUCCESS) { printf("vaRenderPicture failed\n"); return -1; } status = vaEndPicture(va_display, va_context_id); if (status != VA_STATUS_SUCCESS) { 在 Windows 操作系统中,获取程序的堆栈信息可以使用以下两种方式: 1. 使用 Visual Studio: - 打开 Visual printf("vaEndPicture failed\n"); return -1; } vaDestroySurfaces(va_display, &va_src_surface Studio,选择“调试”菜单下的“附加到进程”选项; - 在弹出的对话框_id, 1); av_frame_free(&pFrame); frame_count++; } } av_packet_unref(&packet); 中选择要获取堆栈信息的进程,点击“附加”按钮; - 等待程序运行到需要获取堆栈 } // Clean up vaDestroyBuffer(va_display, seq_param_buf_id); vaDestroyBuffer(va_display, pic_param信息的地方,然后在 Visual Studio 中选择“调试”菜单下的“Windows”选项,再选择“_buf_id); vaDestroyBuffer(va_display, va_roi_buf_id); vaDestroySurfaces(va_display, &va_surface_id, 1); vaDestroyContext(va_display, va_context_id); vaDestroyConfig(va_display, config_id); vaTerminate(va_display调试窗口”下的“调用堆栈”选项。 2. 使用 Windows 自带的工具: - 打开); avcodec_free_context(&pCodecCtx); avformat_close_input(&pFormatCtx); return 0; } ``` “任务管理器”,在“详细信息”选项卡中找到要获取堆栈信息的进程; - 右键注意,这只是一个简单的示例代码,可能需要根据实际情况进行修改。同时,还应该点击该进程,选择“转储文件” -> “完整转储”; - 打开转储文件(.dmp注意以下几点: - ROI 数据的格式和内容要符合 H.264 标准; - ROI 数据要在每一帧文件),使用 Windbg 工具打开该文件; - 在 Windbg 命令行中输入“!analyze -v”命令编码前设置,否则不会生效; - VA API 的具体使用方式可以参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值