(借一下轉載的文章的題目。。懶得起了,在此總結下目前碰到這條錯誤的原因)
在自己寫的渲染器項目中,經常碰到 “未加載 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的一種可能原因