gpt4 book ai didi

C++ DLL接口(interface)和内存

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:12 25 4
gpt4 key购买 nike

我的问题可能与 here 有关和 here :Q 如果我们在堆栈上创建另一个 DLL 中定义的类的类型实例,是否安全?

// A DLL
class DLL_EXPORT Foo;


// Target exe
int main()
{
// bad, not supposed to do this:
Foo* x = get_instance_from_dll();
delete x;

// **Question**:
// what about stack variable of type declared in the DLL?
// is this alright?
Foo x;

}

最佳答案

不,这不安全。使用公开 C++ 代码的 DLL 存在三个基本问题:

  • 使用不同分配器的 DLL。所以你的 delete 不能破坏对象。你已经知道那个了。

  • 您的编译器没有为类对象计算相同的布局。如果它有任何成员是标准 C++ 库类,如 std::string 或 std::vector,则问题尤其严重。该 DLL 可以使用这些类的不同 版本进行编译。就像 C++11 之前的版本一样,它在 std 类实现中引起了很多变化。或者使用了优化的发布build设置并且没有启用迭代器调试,而你启用了。

  • DLL 可能跨模块边界抛出的任何异常对象都会遇到上述两个问题。当您修复 DLL 接口(interface)以确保安全时,这一点很容易被忽视,您不能轻易地对异常做同样的事情。

第二个项目符号是你的克星,你的编译器会计算出错误的对象大小,并且不会在堆栈帧上为它保留正确的空间量。当实际对象大小时,DLL 中的代码会覆盖堆栈中的其他变量,这尤其令人讨厌。很难诊断。

关于C++ DLL接口(interface)和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24692674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com