2011-06-08 43 views
0

我有一個使用/ MTd運行時庫的本機C++ exe。我無法改變這個選項,因爲我沒有太多的控制這個EXE的構建。我需要在這個exe中調用一個CLI C++ dll,它會返回一個帶有STL向量成員變量的類。在CLI C++方法返回時,出現堆損壞錯誤。根據我的分析,發生這種情況是因爲有兩個不同的CRT,並且矢量釋​​放方法由於地址無效而在本機CRT和炸彈中運行。在帶有/ MTd CRT的本地C++ exe中使用CLI C++ dll與/ MDd CRT

如何從一個CLI C++ dll返回一個與另一個CRT編譯的向量來運行我的本機exe?

回答

1

您的評估是正確的 - 在一個CRT內執行的分配無法在不同的CRT內部釋放。這是一條簡單的規則,無法繞過它。

您需要使用相同的運行時庫設置構建兩個模塊,或者只需在模塊邊界之間傳輸POD類型。

+0

壞消息不經常被讚賞。 – 2011-06-11 19:39:47

+0

我不會把這個作爲答案提交,但是如果你絕望了,並且類是由指針而不是按值返回的,並且你在程序執行期間只能調用這個方法幾次,那麼你可以簡單地不刪除該類。它會泄漏,但也許這是可以接受的。正如@ildjarn指出的那樣,真正的答案顯然是修復您的應用程序配置。此外,無法保證矢量訪問操作將來可以在不同的CRT上工作。 – 2011-06-21 20:13:20

+0

感謝ildjarn和David的迴應。現在我已經用指針代替了矢量。由於我知道大小,我創建了原始矢量成員的數組並將它們傳遞給了dll邊界。直到現在,我只需要非常小心地將內存釋放到分配的位置。 – Megha 2011-06-23 15:47:27