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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM