为什么以下代码会触发断言?此代码最初起作用,并且在某个时刻开始触发断言,因为shared_ptr超出了范围。
#include <iostream>
#include <memory>
#include "GLFW/glfw3.h"
int main()
{
if (!glfwInit()){
std::cout << "Failed to initialize GLFW." << std::endl;
return -1;
}
auto window = std::shared_ptr<GLFWwindow>(glfwCreateWindow(1024, 768, "Test", NULL, NULL));
return 0;
}
我只采用了最少量的代码来重现这一点,也许我误解了shared_ptr的使用。我也尝试过它的语法:
std::shared_ptr<GLFWwindow> window(glfwCreateWindow(1024, 768, "Test", NULL, NULL));
我在调试器(VS2013)的输出窗口中得到的确切错误消息如下:
Debug Assertion Failed!
Program: C:\Users\...\xxxx.exe
File: f:\dd\vctools\crt\crtw32\misc\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
从我所研究的内容来看,它似乎试图将shared_ptr两次释放 - 是这种情况,我该如何防止这种情况?值得一提的是,将类型从GLFWwindow
交换为struct test { int i; };
不再触发断言。这是否意味着GLFWwindow在内部删除指针?如果是这样,为什么代码在某一点上起作用但现在不起作用?
答案 0 :(得分:6)
很有可能因为glfwCreateWindow
使用malloc
分配数据,而std::shared_pointer
使用delete
释放内存。这是两种不同的内存分配系统,不应混用。
此外,您不能释放glfwCreateWindow
返回的指针,您需要正确关闭窗口,因为您不知道glfwCreateWindow
可能分配了哪些其他数据。您需要一个调用glfwDestroyWindow
的自定义删除。