【发布时间】:2014-07-11 07:51:27
【问题描述】:
我的问题可能与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;
}
【问题讨论】:
-
DLL可以导出类的成员函数,但是类的定义是通过头文件编译成你的可执行文件的。
-
是什么让您说在堆栈上的 DLL 中获取指向实例的指针是不好的?我知道的规则是“如果你从 DLL 调用 new,你必须从同一个 DLL 调用 delete”
-
@JonathanPotter 如果 DLL 和 EXE 是使用不同的编译器构建的,那么它们都可能为 Foo 类产生不同的内存布局吗?这是否意味着栈上分配的Foo和DLL中new-ed的Foo不同?
-
@snowandotherjoys 所以在 exe 的堆栈上声明 Foo 完全没问题? “Foo* x = new Foo();”也安全吗?
-
dll和exe是如何构建的?他们是使用具有相同标志的相同编译器,还是使用不同的编译器(甚至是编译器的版本)?