gpt4 book ai didi

c++ - 为什么这个 shared_ptr 在超出范围时抛出断言?

转载 作者:搜寻专家 更新时间:2023-10-31 00:13:50 25 4
gpt4 key购买 nike

为什么下面的代码会触发断言?此代码最初有效,并在某个时候开始触发断言,因为 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 正在内部删除指针?如果是这样,为什么代码在某一时刻有效,但现在却无效?

最佳答案

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

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

关于c++ - 为什么这个 shared_ptr 在超出范围时抛出断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com