gpt4 book ai didi

C++ __declspec( dllexport ) 函数无法访问实例变量

转载 作者:行者123 更新时间:2023-11-28 08:10:36 25 4
gpt4 key购买 nike

我试图通过导出为 DLL(在 Windows/VS 2010 上)来保护一些 C++ 代码。

在下面的示例中,var 在父类(super class)构造函数中设置,并且调试器显示它肯定设置为引用某物

测试是在使用包含测试类的 DLL 的代码中构造的。

但是当 go 被一个测试实例调用时(从 DLL 调用,但调用方法由 DLL 消费者调用) var 是一个空指针(它的值为 0)。

这是一种简化,因为我不允许共享实际代码。

//Headers

class Base {
public:
__declspec(dllexport) Base();
private:
Foo* var;
};

class Test : Base {
public:
__declspec(dllexport) Test();
__declspec(dllexport) void go();
private:
};

//Body

Base::Base() {
var = new Foo();
}

Test::Test() : Base() {
}

void Test::go() {
var->do_something();
}

在消费代码中,header是

class Base {
public:
__declspec(dllimport) Base();
};

class Test {
public:
__declspec(dllimport) Test();
__declspec(dllimport) void go();
};

实际的代码要复杂得多,但如果有人能告诉我是否有已知的 dllexport 实例变量限制,或者我是否更有可能在空指针上调用方法,我将不胜感激测试,或者它可能是一个 dllexport 和继承问题。这段代码在我拆分消费者代码之前有效,DLL 代码在同一个项目中,它只是在拆分后才被破坏,我想将 dllexporting/dllimporting 函数公开到消费者使用的第二组 header 中。

最佳答案

当您在“消费代码”中按值从一个地方传递一个Test 到另一个地方时,您将导致slicing发生的原因是客户端代码不知道该变量并为类 Test 计算了错误的大小。

要解决这个问题,您也应该在客户端代码中声明变量,或者您可以提供某种静态工厂函数,只允许客户端代码将指针传递给 Test周围是为了避免切片。

关于C++ __declspec( dllexport ) 函数无法访问实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202459/

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