(借一下转载的文章的题目。。懒得起了,在此总结下目前碰到这条错误的原因)
在自己写的渲染器项目中,经常碰到 “未加载 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. (挖坑续填)
参考资料: