天天看點

VS調用dll出現記憶體錯誤

描述:

出現了記憶體錯誤,向dll裡傳遞了一個vector,dll向vector放了一點資料,程式退出的時候有記憶體錯誤。

解答:

vector的本質就是一個變長數組,資料存儲是在堆上的,在dll中存入資料,很可能就是在dll中申請的存儲,在主程式裡面釋放的存儲。如果你的程式采用靜态連結的方式,每一個可執行子產品都會建立自己的crt堆,在子產品内部進行new和delete操作的時候,是在crt堆上進行的,這樣不會出錯,但是如果在dll子產品中申請存儲,但是在主程式子產品釋放存儲,vector不知道如何正确釋放dll中配置設定的記憶體或者釋放存儲的行為是錯誤的。

可以修改連結方式為動态連接配接,也就是dll crt的方式,這種方式下crt堆隻會建立一份,也就是主可行性子產品加載的時候建立的那一份,在同一個子產品申請釋放存儲不會出錯,或者采用靜态連結的方式,不要在主程式和dll之間傳遞vector,或者先給vector預留足夠的空間作為靜态存儲使用。

繼續閱讀