调用vkUnmapMemory后释放堆分配的vertices指针是否安全?
调用vkUnmapMemory后释放vertices指针是否安全?
完全安全。
原因如下:
- 你通过
memcpy已经把vertices指向的堆内存数据完整复制到了vkMapMemory返回的设备内存映射区域(data指向的地址)。 vkUnmapMemory的作用仅仅是解除应用层虚拟地址和设备内存之间的映射关联,不会修改或删除已经复制到设备内存里的数据,也不会和vertices这个堆分配的指针产生任何绑定关系。- 一旦
memcpy执行完成且没有异常,vertices的任务就已经完成了,此时释放它不会对顶点缓冲区的内容造成任何影响。
需要注意的细节:
- 要确保
bufferInfo.size不超过vertices实际分配的内存大小(即n * sizeof(unsigned char)),避免出现越界拷贝的问题。 - 如果后续代码还有其他地方需要使用
vertices中的数据,那需要等所有使用场景结束后再释放,但仅就你给出的这段代码流程而言,释放是完全没问题的。
你的代码示例:
unsigned char *vertices = (unsigned char*)calloc(n, sizeof(unsigned char)); ... void* data; vkMapMemory(device, vertexBufferMemory, 0, bufferInfo.size, 0, &data); memcpy(data, vertices, (size_t) bufferInfo.size); vkUnmapMemory(device, vertexBufferMemory);
内容的提问来源于stack exchange,提问作者SOSparachuter1
相关产品推荐
相关产品推荐

