安全++
它是安全的delete
指针当且仅当
- 基类的析构函数是虚拟的。
- 指针被
new
返回(不new[]
,不malloc
,不mmap
,...) - 您是指针的唯一所有者。换句话说:如果没有其他代码片段(在dll内或在dll外)将要使用或销毁尖锐的对象。
至于标准而言,该库必须使用相同版本的运行时库定义配置功能的链接。相同的要求适用于静态链接在一起的单独对象文件。在技术上,内存分配函数的多种不同实现违反了一个定义规则,但是用标准库扩展语言的C++实现可能会扩展语言以允许这些函数的多种不同实现。如果这是您所使用的执行的话,那么它可能不会是安全的解除分配共享库分配的内存,除非你能证明同样的版本中使用的库以及删除的对象的代码两者。
无论是安全与否,这是一个坏主意,以提供返回的资源(如动态内存),其采用释放这些资源照顾的API,而不是API。
错误,析构函数不一定是虚拟的,以便删除是安全的。如果你想要调用任何派生类的析构函数,它只是虚拟的。 – emlai
@tuple_cat *“如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,并且**静态类型应具有一个虚拟的析构函数或行为是未定义的**。“*所以说标准。 – user2079303
@tuple错误 - 标准说如果基本析构函数不是虚拟的,则通过基指针删除派生对象是未定义的行为。该标准没有说明在这种情况下可能或不可能调用哪些析构函数。 –
这取决于编译器和标志是动态库编译时使用的版本。
图书馆对new
的调用会从库控制的堆中抓取对象。
您对delete
的呼叫将对象放回由可执行文件控制的堆。
这可能是也可能不是由同一库管理的相同的堆。
安全的方法是将delete
包装在库调用中,如fopen/fclose。
(加载的lib通过以通常的方式调用“new”来分配它 - 不使用就地提供给我的内存地址的“new”,或类似的东西)。 –
看起来像这个问题来自用法的MS东西。不,的Linux/Unix系统中实现共享库正确放在第一位,而不是废话从MS – Slava
如果我能找到一个官方十岁上下的基准说为多,这会解决我的问题。 :) –