【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的一种可能原因

 

posted @ 2020-10-20 19:12  DamienTian  阅读(2017)  评论(1编辑  收藏  举报