它是安全的呼吁删除一个基类指针通过动态加载库分配的堆对象?该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
如果我能找到一个官方十岁上下的基准说为多,这会解决我的问题。 :) –