通过在C 中动态加载的LIB分配的基础级指针上调用删除的安全性

safety of calling delete on base-class pointer allocated by dynamically loaded lib in C++

本文关键字:指针 安全性 删除 调用 LIB 动态 加载 分配      更新时间:2023-10-16

在基本级指针上调用删除是安全的,以通过动态加载的库分配的堆对象?LIB和客户端都是由同一编译器(GCC)构建的。

仅在

时,delete是安全的
  • 基类的破坏者是虚拟的。
  • 指针由new返回(不是new[],而不是malloc,而不是mmap,...)
  • 您是指针的唯一所有者。换句话说:如果没有其他代码(在DLL内部或之外)将使用或破坏指向对象。

就标准而言,库必须与定义分配函数的相同版本的运行时库链接。同样的要求也适用于静态链接在一起的单独对象文件。

技术上多个不同的内存分配函数实现违反了一个定义规则,但是使用标准库扩展语言的C 实现可能会扩展该语言以允许这些功能的多个不同的实现。如果您使用的实施情况是这种情况,那么除非您可以证明库和删除对象的代码都使用相同的版本,否则可以通过共享库分配的内存进行处理。


是否安全,提供返回资源的API是一个坏主意(例如动态内存),而不是照顾这些资源的API。

它取决于编译器的版本,并与。

图书馆对new的调用从库控制的堆中抓住对象。

您对delete的调用将对象放回由可执行文件控制的堆。

这可能是或可能不会由同一库管理的堆。

安全的方法是将delete包装在库呼叫中,例如fopen/fclose。

是的,如果将其分配给new,并且如果库(或任何其他代码)在删除后不尝试使用该对象。