Dynamic_cast 返回 NULL 但它不应该返回

2023-11-23

我有以下类层次结构:

class IStorage {
    [...]
}
Q_DECLARE_INTERFACE(IStorage, "ch.gorrion.smssender.IStorage/1.0")


class ISQLiteStorage: public IStorage { 
    Q_INTERFACES(IStorage)

    [...] 
}
Q_DECLARE_INTERFACE(ISQLiteStorage, "ch.gorrion.smssender.ISQLiteStorage/1.0")


class DASQLiteStorage: public QObject, public ISQLiteStorage {
    Q_OBJECT
    Q_INTERFACES(ISQLiteStorage)

    [...]
}

我正在使用 QT,并尝试使用 QtPlugin 创建一个插件(为我的应用程序)。 我正在创建 DASQLiteStorage 的一个实例,并将该实例赋予插件内的一个对象:

// the next line is within my main app.
// storage is the DASQLiteStorage instance.
// gateway is an object from within the plugin.
gateway->setDefaultStorage(storage);

// this method lies within the plugin
void AbstractGateway::setDefaultStorage(IStorage* storage) {
    defaultStorage_ = dynamic_cast<ISQLiteStorage*>(storage);
}

问题是,dynamic_cast 返回一个空指针(不是预期的),而在我的主应用程序中执行dynamic_cast(即在“gateway->setDefaultStorage(storage);”之前)给了我有效的指针(预期)。

有谁知道为什么会发生这种情况?该程序是否在与插件不同的内存范围中运行?这会导致这样的问题吗?任何想法如何解决这一问题?

多谢!


编辑: 我尝试了一些建议:

// this method lies within the plugin
void AbstractGateway::setDefaultStorage(IStorage* storage) {
    ISQLiteStorage* s = dynamic_cast<ISQLiteStorage*>(storage);
    s = static_cast<ISQLiteStorage*>(storage);
    s = qobject_cast<ISQLiteStorage*>((QObject*)storage);

    defaultStorage_ = s;
}

在该方法的第一行中,s 等于 NULL,第二行中的 s 包含正确的指针,第三行中的 s 包含其他指针。为什么这些指针不相等?
为什么尽管我现在正在使用,dynamic_cast 仍然无法工作:

pluginLoader()->setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint);




编辑2: 我注意到,我在代码中进一步得到的分段错误也与此有关。我有以下构造:

// The following classes are defined within the main app.
class ILoginAccount: public IAccount [...]

class AbstractAccountStroageOfficer {
public:
    AbstractAccountStroageOfficer(IAccount* account)[...]
}


// These classes are defined within my plugin and are created from within the plugin.
class BCAccount: public ILoginAccount {
public:
    BCAccount()
      : ILoginAccount(new DAAccountStorageOfficer(this))
    {};
}

class DAAccountStorageOfficer: public AbstractAccountStorageOfficer {
public:
    DAAccountStorageOfficer(ILoginAccount* account)
      : AbstractAccountStorageOfficer(account) // This line raises a segfault.
    {
        IAccount* a = account; // This line raises a segfault as well.
        a = dynamic_cast<IAccount*>(account); // This as well.
        a = static_cast<IAccount*>(account); // This as well.
    }
}

这些分段错误不应该发生,不是吗?但他们为什么这么做呢?


基本上,RTTI 在跨模块边界时是不可靠的。不同的编译器在这里有不同的行为;您必须研究您的编译器/版本在这种情况下的行为。当然,如果您的主应用程序和插件有不同的编译器/版本,那么它显然没有机会工作。

使用 static_cast 作为解决方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dynamic_cast 返回 NULL 但它不应该返回 的相关文章

随机推荐

  • 覆盖 Rails 3 中的默认脚手架生成器

    我已经为 Rails 3 中的控制器创建了一个生成器 现在我想在使用脚手架生成器时使用这个生成器作为默认生成器 那可能吗 您的自定义控制器文件的正确位置是lib templates rails scaffold controller con
  • 如何将 ISO 8601 日期时间字符串转换为 Python 日期时间对象? [复制]

    这个问题在这里已经有答案了 我得到一个格式类似于 2009 05 28T16 15 00 的日期时间字符串 我相信这是 ISO 8601 一种黑客选项似乎是使用解析字符串time strptime并将元组的前六个元素传递到日期时间构造函数中
  • 如何在多个 CruiseControl.NET 版本之间共享标签值?

    我在 CruiseControl NET 中设置了两个项目 CI 构建和夜间构建 它们都执行相同的 NAnt 脚本 但参数不同 CruiseControl NET 标签 当前由默认标签器 作为版本的构建部分嵌入到 AssemblyInfo
  • 元素的流体网格居中,无需在父级上设置硬宽度

    我想将元素的 网格 居中 当调整大小时 该元素会调整到自身居中 像这样
  • AngularJS 修剪模型中的前导零,而视图/输入值仍然保持不变?

    对于类型为数字的输入元素 当输入的数字具有前导零 例如 0000123456 时 模型将更新为 123456 而视图 输入仍保持相同的 0000123456 但是 如果我从数字切换到文本 一切都会按预期进行 我想要一个数字 因为它会显示移动
  • wix - 如何删除非空文件夹

    我已阅读该网站上存在此类问题的所有主题 但找不到我需要的内容 我有一个程序的两个版本 旧版本和新版本 在旧版本中我有文件夹 f1 在新版本中我没有这个文件夹f1 当新程序的安装程序检测到旧版本时 它会删除该旧版本 但不会删除文件夹 f1 如
  • map() 返回 LIST 时出现语法错误

    这有效 print map x gt 1 5 print map x gt 1 5 print map x gt 1 5 但这会引发语法错误 print map x gt 1 5 这是已记录的错误 未记录的错误 还是我不明白为什么它不应该编
  • 检查 Vim 中当前选项卡是否为空

    我正在编写一个 vim 插件 其中我需要检查用户正在查看的当前选项卡是否为空 如果它不为空 比如用户已经在查看缓冲区或有几个窗口 那么我想创建一个新的空选项卡并在那里使用我的插件 但如果它是空的 我想加载我的插件而不打开新选项卡 我在文档中
  • 读取 SQL Server 事务日志

    我们如何读取 SQL Server 事务日志 我知道使用 DBCC 日志 数据库 4 它会生成日志输出 现在我想解码十六进制格式的日志记录 0x00003E001C000000A500000001000200BE04000000000602
  • 这是你的分页方式,还是有更好的算法?

    我希望能够采取如下序列 my sequence foo bar baz spam eggs cheese yogurt 使用如下函数 my paginated sequence get rows my sequence 3 To get f
  • 如何防止 Webkit 文本渲染在 CSS 转换期间发生变化

    我使用 CSS 转换在 CSS 转换状态之间进行转换 基本上是转换元素的比例 我注意到 当元素转换时 页面上的其余文本 在 Webkit 中 往往会稍微改变其渲染 直到转换完成 Fiddle http jsfiddle net russel
  • 如何替换 .NET Standard 中的 DTE2

    已经有一段时间了 NET Standard是微软推出的 早些时候 如果我想获取有关Project Solution和其他相关对象 例如解决方案路径 解决方案中的项目等 我使用DTE2type 是里面的一个接口EnvDTE80集会 但EnvD
  • 多个客户端同时访问服务器

    我有一个登录屏幕 现在说我们有 2 个用户 用户名 amit 和 ajay 密码 pass 和 word 现在我希望假设他们是在同一系统上打开的两个桌面应用程序 我想要多个客户端同时访问服务器 意思是说 在一个登录屏幕中 amit 输入用户
  • Javascript 检测用户何时保存网页?

    JavaScript 可以检测用户何时将网页保存到本地磁盘吗 或者其他一些客户端脚本中是否有类似的功能 您可以观看组合键命令ctrl s被击中 但如果用户通过菜单选择保存 则无法捕获该信息
  • 安卓 SIP SSL

    我在 Android 2 3 4 中使用 SIP 堆栈 一切运行良好 但是 我需要系统使用 SSL 并创建了以下代码 SipProfile Builder builder new SipProfile Builder user domain
  • Android 只允许一次在屏幕上显示一个导航页面,使用

    下面2个实现有什么区别 public App The root page of your application MainPage new Views MainPage public App MainPage new NavigationP
  • 甜甜圈缓存是否可以与 ASP.NET MVC 一起正常工作?

    通过甜甜圈缓存 我指的是斯科特 格思里的博客文章这太棒了 有谁知道这是否正常 请注意 从 MVC 2 0 开始 此技术不再有效 这很糟糕
  • Sql HierarchyId 如何获取最后的后代?

    Using t sql 等级制度我如何获得所有没有子项的行 即最后的后代 假设我的表结构如下 Id Name HierarchyId 并且有这些行 1 Craig 2 Steve 1 3 John 1 1 4 Sam 2 5 Matt 2
  • 如何在 woocommerce 中添加自定义运费?

    我想使用 woocommerce 中的代码添加运费 这是我的要求 如果我的发货国家 地区是澳大利亚 则运费会有所不同 澳大利亚境外的运费也会有所不同 现在 如果我的发货国家 地区是澳大利亚并且 1 if order value is lt
  • Dynamic_cast 返回 NULL 但它不应该返回

    我有以下类层次结构 class IStorage Q DECLARE INTERFACE IStorage ch gorrion smssender IStorage 1 0 class ISQLiteStorage public ISto