我如何将 C++ 对象传递给具有不同 _ITERATOR_DEBUG_LEVEL 的 DLL

2024-02-26

我的可执行文件调用了许多我自己编写的 DLL。根据这些 DLL 使用的第 3 方 C++ 库,我无法自由选择所有 DLL 的编译器设置。因此在一些DLL中_ITERATOR_DEBUG_LEVEL设置为 2(调试版本中的默认值),但在我的可执行文件中_ITERATOR_DEBUG_LEVEL根据严重的性能问题,设置为0。

当我现在通过一个std::string当 DLL 尝试将其复制到本地 std::string obj 时,应用程序就会崩溃,因为 DLL 中字符串对象的内存布局与我的可执行文件中的不同。到目前为止,我通过传递 C 字符串来解决这个问题。我什至写了一个小类来转换std::map<std::string, int>与 C-Data 中的临时表示形式之间的通信,以便在 DLL 之间传递此类数据。这有效。

我怎样才能克服这个问题?我想传递更多不同的类和容器,由于多种原因我不想使用_ITERATOR_DEBUG_LEVEL = 2.


问题在于 std::string 和其他容器是模板类。它们是在每个二进制文件的编译时生成的,因此在您的情况下,它们的生成方式有所不同。你可以说它们不是同一个对象。

要解决此问题,您有多种解决方案,但它们都遵循相同的经验法则:不要在二进制文件之间共享的标头代码中公开任何模板代码.

您可以仅出于此目的创建特定接口,或者只是确保标头不公开模板类型和函数。您可以在二进制文件中使用这些模板类型,但不要将它们暴露给其他二进制文件。

接口中的 std::string 可以用 const char * 替换。您仍然可以在系统中使用 std::string,只需在接口中请求 const char * 并使用 std::string::c_str() 来公开您的数据。

对于地图和其他容器,您必须提供允许外部代码操作内部地图的函数。就像“Find(const char* key);”。

主要问题在于公开类的模板成员。解决此问题的一种方法是使用 PImpl 习惯用法:创建(或生成)一个 API、标头,这些标头仅公开您的二进制文件可以执行的操作,然后确保该 API 具有指向二进制文件内的真实对象的指针。该 API 将在外部使用,但在您的库内部您可以使用任何您想要的代码。 DirectX API 和其他操作系统 API 都是通过这种方式完成的。

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

我如何将 C++ 对象传递给具有不同 _ITERATOR_DEBUG_LEVEL 的 DLL 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 在.rdlc报告的底部设置一个文本框

    我在 rdlc 报告中使用 tablix 有一个文本框 其中包含文本 签名 我想将此文本框放置在报告最后一页的底部 就在页脚之前 我已经用谷歌搜索了这个解决方案 但没有找到满意的结果 我的环境是VS2010 framework 4 0 有什
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 在运行时将设计时面板添加到 TabPage

    我希望在设计时有一个带有控件的面板 但我想在运行时将此面板添加到 TabControl 的所需 tabPage 中 我写了这样的东西 没有用 面板没有显示在选项卡页中 请帮我 panel2 Parent tabGuy TabPages 0
  • XPath - 提取两个节点之间的文本

    我的 XPath 查询遇到问题 我必须解析一个 div 它被划分为未知数量的 部分 其中每一个都由 h5 和部分名称分隔 可能的部分标题列表是已知的 并且每个标题只能出现一次 此外 每个部分可以包含一些 br 标签 所以 假设我想提取 Se
  • 尽管在 Windows 的 VS Code 中安装了字体并激活了连字,但仍无法显示 FiraCode

    在我的设置中我有 editor fontLigatures true editor fontFamily Fira Code Comic Sans MS Tahoma Consolas 我已经尝试过 根据this https github
  • 在 IIS7 中重写映射 — 如何使匹配项选择性地包含尾部斜杠?

    我已经阅读了几种组合的前 30 名 Google 搜索结果IIS rewrite map condition等等 但我在 microsoft com 网站或其他地方找不到任何像样的文档 我在 IIS7 中有一堆重写映射 我想处理它们 无论它
  • svn:ignore 的模式匹配字符

    在网上回应一个问题 svn ignore 模式的语法 记录在某处 唯一的图案 我可以在中找到匹配的字符 svn ignore 下的 SVN 书是 颠覆书 svn ignore http svnbook red bean com en 1 0
  • 使用php验证数字签名

    我有一封经过数字签名的电子邮件 email BEGIN PGP SIGNED MESSAGE Hash SHA1 The below email has been digitally signed for test purposes We
  • 从 PostgreSQL 检索原始通知文本

    我正在使用 PL pgSQL 尝试模拟我在 Oracle PL SQL 中可以执行的操作 其中 dbms output 相当于 stdout 我读过 RAISE NOTICE 可能是处理此问题的最佳方法 然而我的问题是 当我从 psycop
  • 可以从自定义模型绑定器访问数据库吗?

    假设我有一个对象 它从 HttpPost 获取一些数据 从数据库获取一些数据 我想我想允许 ModelBinder 访问数据库 存储库以获取帖子中丢失的数据 实际上 这是一个好主意还是坏主意 鉴于自 2010 年初以来我对这类事情的思考已经
  • Swift 5.4 十六进制转 NSColor

    我正在为 macOS 开发一个程序 我需要将十六进制颜色转换为 NSColor 我在这里查看了建议的解决方案 将十六进制颜色代码转换为 NSColor https stackoverflow com questions 8697205 co
  • EPPlus 中的隐藏列不起作用

    我想使用 EPPlus nuget 包隐藏 excel 中的一列 但它不起作用 它没有隐藏该列 这就是我发现应该能解决问题的方法 也许有一个错误 worksheet Column 1 Hidden true 我使用的是4 5 2 1版本 项
  • 以编程方式创建 XPath 表达式

    是否可以从网页上光标的位置自动生成最具体的 XPath 表达式 XPath 表达式将随着 onMouseMove 事件 而改变 如果可以的话 你会如何实施 或者它已经在某些地方实施了Javascript or Python图书馆 我更喜欢它
  • 不带空格的字符串长度 (C#)

    快点小问题 我需要计算字符串的长度 但不包括其中的空格 例如 对于像 I am Bob 这样的字符串 string Length将返回 8 6 个字母 2 个空格 我需要一种方法或其他东西来给我字母的长度 或数量 在 我是鲍勃 的情况下为
  • 文本中的句子注释不带标点符号

    我很难让 CoreNLP 系统正确找到诗歌语料库中一个句子的结束位置和另一个句子的开始位置 其陷入困境的原因 有些诗在整个长度上都没有标点符号 有时甚至没有大小写 有些诗的句子从一个段落延伸到另一个段落 有些诗每行开头都大写 这是一个特别棘
  • 我的 FreeMarker 方法返回一个带有 ${variable} 的字符串——如何强制 FreeMarker 解析它?

    我创建了一个类来实现模板方法模型Ex来自 FreeMarker 假装exec 函数返回一个字符串 你好 用户名 我将该类分配给数据模型中的一个方法 dataModel put myMethod myClassInstance dataMod
  • 如何从浏览器上传文件(附件)?

    我无法上传附件以使浏览器正常工作 一些提示是here http japhr blogspot de 2010 02 how to upload files in couchapp html 其他的there http comments gm
  • ResultSet.TYPE_SCROLL_SENSITIVE 的行为

    我对 a 的行为感到困惑ResultSet这是类型TYPE SCROLL SENSITIVE 我对此的理解是 我执行一个选择查询 返回一个结果集 我打印出第一行中特定列的值 然后我执行Thread sleep 10000 这会使程序暂停 1
  • 在实体框架 6 中保存分离的实体

    我读过很多关于在实体框架中保存分离实体的帖子 所有这些似乎都适用于旧版本的实体框架 它们引用了诸如ApplyCurrentValues和ChangeObjectState之类的方法 但这些方法似乎并不存在 一时兴起 我决定尝试一种通过智能感
  • VS2008到VS2010项目转换

    我有一个在 VS2008 中构建的组件项目 目标是 NET Framework 3 5 我最近下载了 VS2010 Beta 1 以确保在切换到新 IDE 时该项目能够正确转换 该项目包含对几个针对该框架 2 0 版本构建的第三方 dll
  • 使用 URL 时找不到 Webpack 2 模块

    我刚刚更新了我的 Angular 2 项目以使用 Webpack 2 它运行得很好 然而 我在使用时遇到了一个新问题resolve alias key 当我使用 webpack 1 时 这段代码工作得很好 webpack config js
  • 我如何将 C++ 对象传递给具有不同 _ITERATOR_DEBUG_LEVEL 的 DLL

    我的可执行文件调用了许多我自己编写的 DLL 根据这些 DLL 使用的第 3 方 C 库 我无法自由选择所有 DLL 的编译器设置 因此在一些DLL中 ITERATOR DEBUG LEVEL设置为 2 调试版本中的默认值 但在我的可执行文