给定:可执行文件使用 dll。他们有不同的 c/c++ 运行时。它们之间的接口存在哪些限制?除了他们使用相同的编译器,相同的 Boost 版本(但不同的预编译 boost 库)。
我知道不同的运行时可以有不同的堆。因此,delete 必须对应于同一堆中的 new。
最重要的是,我们不能通过接口 STL 对象传递,因为当我们构建 exe STL 对象时与一个运行时链接,而在构建 dll 时,相同的对象(如果我们通过引用或通过接口复制传递它)将与另一个运行时链接。另一个运行时可以具有该对象的不同实现。
让我们考虑案例:
我认为以下是安全的。具有参数的 Dll 导出函数:对包含私有 STL 类作为成员的导出用户定义类的引用。Dll 为这个对象分配内存。Exe 在要删除该对象时调用该对象的 Release 方法。
我认为以下内容并不安全。用户定义的类在 exe 中实例化并通过 exe/dll 接口传递。此类包含私有 STL 类作为成员。exe 和 dll 共享此用户类的头文件/实现文件。当此类构建在不同的项目中时,将使用不同的 STL 实现。例如 string::size() 的不同实现(来自不同的运行时)将应用于内存中的同一对象。
我认为以下是安全的。用户定义的类在 exe 中实例化并通过 exe/dll 接口传递。此类不依赖于标准库,它仅使用原始 C++ 类型。exe 和 dll 共享此用户类的头文件/实现文件。此外,我们必须控制 new 和 delete 对应于同一个堆。例如,我们可以重载 new/delete,以便它们使用 ::GetProcessHeap。
我认为以下是不安全的:通过 exe/dll 接口传递 boost 对象,因为它们可以依赖于标准库类。也删除可能不对应于新的堆。
我认为以下内容是不安全的:即使我们通过 exe/dll 接口传递 boost 对象并且它们不依赖于标准库类但不仅作为标头实现 - 也可以使用一个 boost lib 创建对象(对于一个运行时) 并与另一个 boost lib 一起使用(用于另一个运行时)。也删除可能不对应于新的堆。
此外,我想使用某种智能指针将对象的引用(在第 3 项中提到)从 exe 传递到 dll 以及从 dll 到 exe。我认为这个智能指针也应该重载 new/delete 以从默认进程堆中分配引用计数器。当它将尝试删除指向的对象时,它将调用由该对象重载的删除(如在 item3 中)
对于第 1 项中的对象,我想使用自定义智能指针,它将调用指向对象的释放方法(如 boost::shared_ptr 和自定义释放)
哪些问题没有被提及?请纠正我。