当我使用GCC编译相同的库时,有时会以release模式编译,有时又以debug模式编译,这样ABI兼容性是否得到保证?(在使用同一编译器的情况下)
我有一个可执行文件和一些共享对象(其中一些依赖于其他对象),我想能够替换release/debug共享对象而无需重新编译所有内容,只需重新编译感兴趣的共享对象即可。
这是可能的吗?还是说某些情况下我可能会出现未定义的行为?(假设我的代码在release和debug模式下都严格打包和填充)
编辑:
我将详细说明我们遇到的问题。我们有一个自定义版本的intrusive_ptr,在debug模式下,我们有自己的intrusive_ptr,它只有一个成员是boost::intrusive_ptr,在release中,我们仅使用boost::intrusive_ptr。我们的intrusive_ptr的API与boost::intrusive_ptr相同,并且该类中没有任何虚函数。我们看到的情况是:
如果我们使用所有debug libs或所有release libs,则一切正常。如果我们混合使用debug可执行文件和release libs,则会从intrusive_ptr中出现内存泄漏,它不会释放对象。
我们的intrusive_ptr和boost::intrusive_ptr的sizeof在debug和release中都是相同的(我们的类不增加任何额外的大小开销)。
所以我想知道可能会导致泄漏的原因,ABI差异是我想到的唯一的事情。
有什么想法吗?
我有一个可执行文件和一些共享对象(其中一些依赖于其他对象),我想能够替换release/debug共享对象而无需重新编译所有内容,只需重新编译感兴趣的共享对象即可。
这是可能的吗?还是说某些情况下我可能会出现未定义的行为?(假设我的代码在release和debug模式下都严格打包和填充)
编辑:
我将详细说明我们遇到的问题。我们有一个自定义版本的intrusive_ptr,在debug模式下,我们有自己的intrusive_ptr,它只有一个成员是boost::intrusive_ptr,在release中,我们仅使用boost::intrusive_ptr。我们的intrusive_ptr的API与boost::intrusive_ptr相同,并且该类中没有任何虚函数。我们看到的情况是:
如果我们使用所有debug libs或所有release libs,则一切正常。如果我们混合使用debug可执行文件和release libs,则会从intrusive_ptr中出现内存泄漏,它不会释放对象。
我们的intrusive_ptr和boost::intrusive_ptr的sizeof在debug和release中都是相同的(我们的类不增加任何额外的大小开销)。
所以我想知道可能会导致泄漏的原因,ABI差异是我想到的唯一的事情。
有什么想法吗?