为什么这个shared_ptr在超出范围时会抛出一个断言?

时间:2014-08-26 01:44:41

标签: c++ c++11 shared-ptr glfw

为什么以下代码会触发断言?此代码最初起作用,并且在某个时刻开始触发断言,因为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在内部删除指针?如果是这样,为什么代码在某一点上起作用但现在不起作用?

1 个答案:

答案 0 :(得分:6)

很有可能因为glfwCreateWindow使用malloc分配数据,而std::shared_pointer使用delete释放内存。这是两种不同的内存分配系统,不应混用。

此外,您不能释放glfwCreateWindow返回的指针,您需要正确关闭窗口,因为您不知道glfwCreateWindow可能分配了哪些其他数据。您需要一个调用glfwDestroyWindow的自定义删除。