它是安全的呼籲刪除一個基類指針通過動態加載庫分配的堆對象?該lib和客戶端都由相同的編譯器(GCC)構建。安全++
安全++
回答
它是安全的delete
指針當且僅當
- 基類的析構函數是虛擬的。
- 指針被
new
返回(不new[]
,不malloc
,不mmap
,...) - 您是指針的唯一所有者。換句話說:如果沒有其他代碼片段(在dll內或在dll外)將要使用或銷燬尖銳的對象。
至於標準而言,該庫必須使用相同版本的運行時庫定義配置功能的鏈接。相同的要求適用於靜態鏈接在一起的單獨對象文件。在技術上,內存分配函數的多種不同實現違反了一個定義規則,但是用標準庫擴展語言的C++實現可能會擴展語言以允許這些函數的多種不同實現。如果這是您所使用的執行的話,那麼它可能不會是安全的解除分配共享庫分配的內存,除非你能證明同樣的版本中使用的庫以及刪除的對象的代碼兩者。
無論是安全與否,這是一個壞主意,以提供返回的資源(如動態內存),其採用釋放這些資源照顧的API,而不是API。
錯誤,析構函數不一定是虛擬的,以便刪除是安全的。如果你想要調用任何派生類的析構函數,它只是虛擬的。 – emlai
@tuple_cat *「如果要刪除的對象的靜態類型與其動態類型不同,則靜態類型應爲要刪除的對象的動態類型的基類,並且**靜態類型應具有一個虛擬的析構函數或行爲是未定義的**。「*所以說標準。 – user2079303
@tuple錯誤 - 標準說如果基本析構函數不是虛擬的,則通過基指針刪除派生對象是未定義的行爲。該標準沒有說明在這種情況下可能或不可能調用哪些析構函數。 –
這取決於編譯器和標誌是動態庫編譯時使用的版本。
圖書館對new
的調用會從庫控制的堆中抓取對象。
您對delete
的呼叫將對象放回由可執行文件控制的堆。
這可能是也可能不是由同一庫管理的相同的堆。
安全的方法是將delete
包裝在庫調用中,如fopen/fclose。
- 1. 安全
- 2. 安全
- 3. WCF安全 - 數據來源安全
- 4. 安全xmlhttprequest從不安全的頁面
- 5. 混合安全和非安全頁面
- 6. 安全和非安全端口
- 7. 安全嗎?覆蓋apache2 index.php的安全
- 8. WCF安全傳輸安全問題
- 9. PHP:filter_var安全性足夠安全嗎?
- 10. 藍牙SDP安全和不安全
- 11. CakePHP:使用安全:: allowedControllers和安全:: allowedActions
- 12. 安全:http在spring安全配置?
- 13. 網絡安全 - url參數安全嗎?
- 14. Android apk安全性如何安全
- 15. 混合安全和不安全通道
- 16. 安全註釋 - 不能安全
- 17. 不安全和安全的HTTP
- 18. Symfony2:安全/安全登錄和註銷
- 19. 類型安全配置安全rendeing
- 20. 安全/非安全瀏覽問題
- 21. PHP註冊表單 - 安全和安全?
- 22. 緩存安全信息安全嗎?
- 23. 安全註釋在春季安全
- 24. 安全和全局變量
- 25. ConcurrentHashMap是否完全安全?
- 26. security:spring安全配置中的全局方法安全元素?
- 27. JQuery安全嗎?
- 28. 安全更新
- 29. ajax安全性?
- 30. 「不安全-EVAL」
(加載的lib通過以通常的方式調用「new」來分配它 - 不使用就地提供給我的內存地址的「new」,或類似的東西)。 –
看起來像這個問題來自用法的MS東西。不,的Linux/Unix系統中實現共享庫正確放在第一位,而不是廢話從MS – Slava
如果我能找到一個官方十歲上下的基準說爲多,這會解決我的問題。 :) –