• 【C++ Debug Visual Studio】vs编译出现未加载 wntdll.pdb的可能原因


    (借一下转载的文章的题目。。懒得起了,在此总结下目前碰到这条错误的原因)


    在自己写的渲染器项目中,经常碰到 “未加载 wntdll.pdb” 这个错误,这种错误经常出现在程序结束运行后释放内存时出现。网上有好多种造成这个错误出现的原因,不同项目有着不同的细节,一些和内存有关(我碰到的都是内存相关),一下可以通过更改项目设置解决(这类解决方案不在本文讨论)。

    这个错误在 VS 上的显示如下:

    总结自己项目出现类似错误的原因:

    1. 改变了指针指向的地址后,没有分配最初或之前指向的内存[1]

    Object::Object{
    // 指向最初分配的空间
    _mesh = new Mesh();
    }
    
    bool Object::SetMesh(Mesh * mesh){
    // 指向其它 Mesh
    _mesh = mesh;
    }
    
    // 虽然析构函数中正确析构,但之前的(最初的)分配空间没有被清理,导致报错

    2. 产生野指针

     这个错误发生在我将一个 vector (vector<Object>)的实例传入了函数中而非引用,并且将其中的值赋给一个指针 array (Object *)。代码如下:

    // Scene.h
    class Scene
    {
    public:
        // 被渲染物体队列
        Object * _objects;
        int _objectCount;
    
        // 读取一个 Vector<Object>,写入 _Objects 中
        //    【注意】:这里传的是实例而非引用
        void GetObjects(std::vector<Object> objects);
    };
    
    // Scene.cpp
    //    【注意】:因为传递的是引用,所以 std::vector<Object> 生成一份拷贝
    void Scene::GetObjects(std::vector<Object> objects) {
        _objectCount = objects.size();
        _objects = new Object[objects.size()];
        for (int i = 0; i < objects.size(); i++) {
            _objects[i] = objects[i];   // 指向拷贝
        }
    //    【错误发生】:当该函数结束时,拷贝出栈并被析构,所以之前的 _objects 里面的指针全部变为野指针,因为指向对象的内存被析构回收了
    }    

    (注:这段代码还有其他问题,但目前只记录这个问题)

    3. (挖坑续填)


    参考资料:

     [1] 航行学园 --- vs编译出现未加载 wntdll.pdb的一种可能原因

  • 相关阅读:
    Redis 学习目录
    Knockout 官网学习文档目录
    C# 知识点回忆..
    爬虫-HtmlAgilityPack
    net core 3.1 知识累积
    共享文件夹(局域网)报错:The username or password is incorrect
    使用 Beyond Compare 工具比较合并 TFS 管理的代码
    创建索引,SQL优化
    LINQ SelectMany代替for循环赋值,把联合查询的值赋值给第1个集合
    判断文件编码
  • 原文地址:https://www.cnblogs.com/thdt/p/13848327.html
Copyright © 2020-2023  润新知