我正在維護一個插件(作爲一個DLL實現)爲一個大的封閉的源應用程序。多年來這一直很好。但是,隨着SDK的最新更新,供應商重載了全球運營商的新功能和刪除功能。這給我造成很多麻煩。會發生什麼是我的插件分配一個字符串。我把這個字符串傳遞給一個靜態鏈接的庫來修改它(改變它的長度,從而重新分配它)。我的應用程序崩潰。一個庫強制全局重載new/delete對我有用!
原因當然是,該字符串位於供應商分配的自定義堆上。靜態鏈接庫對此堆一無所知,並試圖在該內存上使用默認的新/刪除操作符。繁榮。
現在的問題是:如何保持我的代碼清潔並避免使用供應商的操作員?沒有有條件的預處理器宏。我無法避免包含有問題的頭文件,因爲它包含2000行以上的插件所需的代碼。我無法將提供的分配器傳遞到其他庫中,因爲它沒有提供任何機制。我已經竊聽了供應商。我不知道我還能嘗試什麼?
附錄:經過一番激烈辯論後,我設法說服供應商再次從下一個版本的SDK中刪除重載。我已經通過簡單地破解當前的SDK並手動刪除重載來解決了我的即時問題。感謝此主題中的所有建議。他們作爲論點,進一步「證明」首先爲什麼超載是一個壞主意。
您是否必須避免更改靜態庫? – 2010-01-05 16:46:24
我可以在這種情況下更改它,因爲它是開源的。但是我真的很想避免每次發佈新版本時都需要上傳我的修改。我也更喜歡一個解決方案,與庫工作,我沒有源訪問... – BuschnicK 2010-01-05 16:51:32
此外,你在談論std :: string,char * s或其他類型的字符串? – 2010-01-05 16:56:31