通过在C 中动态加载的LIB分配的基础级指针上调用删除的安全性
safety of calling delete on base-class pointer allocated by dynamically loaded lib in C++
在基本级指针上调用删除是安全的,以通过动态加载的库分配的堆对象?LIB和客户端都是由同一编译器(GCC)构建的。
仅在
时,delete
是安全的- 基类的破坏者是虚拟的。
- 指针由
new
返回(不是new[]
,而不是malloc
,而不是mmap
,...) - 您是指针的唯一所有者。换句话说:如果没有其他代码(在DLL内部或之外)将使用或破坏指向对象。
就标准而言,库必须与定义分配函数的相同版本的运行时库链接。同样的要求也适用于静态链接在一起的单独对象文件。
技术上多个不同的内存分配函数实现违反了一个定义规则,但是使用标准库扩展语言的C 实现可能会扩展该语言以允许这些功能的多个不同的实现。如果您使用的实施情况是这种情况,那么除非您可以证明库和删除对象的代码都使用相同的版本,否则可以通过共享库分配的内存进行处理。
是否安全,提供返回资源的API是一个坏主意(例如动态内存),而不是照顾这些资源的API。
它取决于编译器的版本,并与。
图书馆对new
的调用从库控制的堆中抓住对象。
您对delete
的调用将对象放回由可执行文件控制的堆。
这可能是或可能不会由同一库管理的堆。
安全的方法是将delete
包装在库呼叫中,例如fopen/fclose。
是的,如果将其分配给new
,并且如果库(或任何其他代码)在删除后不尝试使用该对象。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- 避免使用指针时C++的性能和安全性
- 在 void 指针中存储整数的往返安全性
- 通过在C 中动态加载的LIB分配的基础级指针上调用删除的安全性
- 是从指针的矢量到常量指针的矢量的重新解释强制转换的安全性
- 从基析构函数static_cast指向派生类的指针的安全性
- 指向STL容器线程安全性(队列/取消队列)的指针
- C++ - 通过指针访问矢量元素的安全性
- 使用指向对象的void *指针的安全性
- 继承对象上指针算术的安全性
- 指针到原语的reinterpret_cast的安全性