内部使用 try catch 防止 C++ DLL 异常

2024-03-20

我正在开发一个 C++ DLL,为主应用程序分配一个数组。 该函数返回错误代码,而不是指向新创建的数组的指针,因此第一个成员的地址将写入函数的参数中。 例子:

int foo(int** arrayPtr) {
  int* array = new int[10];
  *arrayPtr = array;
  return 0;
}

所以,主要是我这样调用该函数:

int* myArray;
int ret;
ret = foo(&myArray);

现在 myArray 指向新创建的数组。

问题1:有更好的方法吗?

比这个更有趣的问题。 如果我将 NULL 作为 foo 的参数传递,则会生成访问冲突异常,因为

*arrayPtr = array;

将尝试写入 0x00000。

所以,我添加了一个 try-catch 块

int foo(int** arrayPtr) {
  int* array = new int[10];
  try {
    *arrayPtr = array;
  } catch(...) {
    return 1;
  }
  return 0;
}

我预计,当我使用 NULL 作为参数调用 foo 时,它将返回 1。不正确!它会产生异常。

问题 2:为什么 DLL 中的 try-catch 块不起作用?

谢谢大家!

P.S.:使用 try-catch 直接在 main 中生成相同的异常不会生成异常(或者更好,它由 try-catch 块正确处理)。


假设你使用的是VC++,try..catch默认情况下不会捕获访问冲突,因为默认的异常处理模型仅捕获同步异常和访问违规是异步例外情况。此处记录了这一点:/EH(异常处理模型) http://msdn.microsoft.com/en-us/library/1deeycx5.aspx

如果您更改项目设置以使用/EHa代替/EHsc那么你的try..catch将捕获访问冲突。

也就是说,为什么不明确检查NULL?使用异常进行流量控制是bad form.

int foo(int** arrayPtr) {
    if (!arrayPtr)
        return 1;
    *arrayPtr = new int[10];
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内部使用 try catch 防止 C++ DLL 异常 的相关文章

随机推荐

  • 错误消息“无法构建模块‘Foundation’”

    我搜索了这个问题 但找不到太多帮助 Error 无法构建模块 Foundation import
  • 如何获取 iOS 中任意线程的正确帧指针?

    获取帧指针的方法 在 iPhone 5s 设备 Xcode 7 上运行的演示应用程序上 我尝试获取frame pointer of an 随意的线程使用thread get state http web mit edu darwin src
  • 设计师如何创建 Line 小部件?

    在 Qt Designer 中 您可以拖动 Line 小部件 这将在您的布局中创建一条线 但我检查了文档和标题 我没有找到 Line 标题 小部件 它是什么 在 Qt 5 7 中 Qt Designer 为水平线生成的代码 可以使用 For
  • 在外部项目上使用 find_package()

    我有一个名为的外部项目messages 我正在使用ExternalProject Add 来获取和构建项目 如果我使用find package messages REQUIRED 在顶层 CMakeLists txt 中cmake 失败是因
  • 如何使用 Win32 API 将 EDIT 控件放入自定义弹出窗口中?

    我正在尝试将 EDIT 控件添加到用作自定义组合框式控件的下拉列表的窗口 最初这个下拉窗口是作为子窗口实现的 WS CHILD 桌面窗口 类似于真正的组合框使用的 ComboLbox 窗口 这工作得很好 但是当编辑窗口放入这样的下拉窗口时
  • 设计时发生火灾事件?

    我目前正在设计一个派生自 System Windows Forms Control 的自定义选项卡控件类 问题是在设计时没有触发任何事件 至少我测试过的事件 包括鼠标事件和键盘事件 这对我来说是一个问题 因为无法在设计器中的选项卡页面之间切
  • scikit-learn 中聚类超参数评估的网格搜索

    我正在对大约 100 条记录 未标记 的样本进行聚类 并尝试使用 grid search 来评估具有各种超参数的聚类算法 我正在使用得分silhouette score效果很好 我的问题是我不需要使用交叉验证方面GridSearchCV R
  • 无法从角 4 快速插入法律归属

    我是 Xcode 和移动应用程序的新手 我正在做一个应用程序来查找当前位置 我在模拟器上测试了它并在控制台中收到了此消息 无法从角 4 插入合法归属 这是什么意思以及如何解决它 import UIKit import Alamofire i
  • 未检测到已安装的组件。元素已经是另一个元素的子元素

    在 App xaml 中 我添加了带有按钮的应用程序资源
  • 如何使用Oracle和.Net客户端实现密码更改功能?

    我正在使用 Oracle 用户来验证 Net 应用程序的用户名和密码 现在我正在研究密码更改功能 数据库具有自定义密码验证 因此如果您尝试更改用户密码并且提供了无效密码 Oracle 将返回多个错误 第一个错误始终是 ORA 28003 指
  • 如何确定我是否过度括号?

    我目前正在尝试避免 C 中的指针算术工作来编写模拟器 通常 如果您添加1对于 C 中的指针 您可以添加所指向对象的大小 但是 我正在尝试使用位和字节 因此这是不希望的 我想知道在这个例子中我是否使用了太多括号 int16 t intptr
  • hadoop namenode端口正在使用

    这实际上是一个备用 HA 名称节点 它的配置与主要和hdfs namenode bootstrapStandby已成功运行 它开始出现在配置文件中定义的标准 HTTP 端口 50070 上
  • 如何使用 List 填充数据表 [重复]

    这个问题在这里已经有答案了 如何将列表转换为数据表 Serializable public class Item public string Name get set public double Price get set public s
  • 如何使用 JAVA API 在 Elasticsearch 版本 8 中创建批量 CRUD 操作请求?

    我们想要创造索引请求 删除请求 更新请求 and 批量请求 in Elasticsearch 版本 8 using JAVA API 但我在elasticsearch v8中没有看到任何java文档官方网站 https www elasti
  • Objective C 相当于 PHP 范围函数?

    我想快速创建一个从 0 到 10000 的数字数组 但步进增量为 500 数组如下所示 0 500 1000 10000 in PHP 这是内置于range http php net manual en function range php
  • 汇总分钟到小时的需求

    我不知道我是否在这个问题的正确部分 我环顾四周并没有找到答案 所以这是我的问题 我有一个 CSV 文件 订购如下 dat lt read csv text Date Demand 01 01 2012 00 00 00 5061 5 01
  • conda.exe:加载共享库时出错:libz.so.1

    无法在我的 RHEL 机器中安装 Anaconda3 2019 10 Linux x86 64 收到错误 gt conda exe 加载共享库时出错 libz so 1 无法从共享对象映射段 不允许操作 Anaconda 或 Minicon
  • 为什么我的排除字段仍然出现在这个 Django 表单中?

    我在用着exclude在我的表单的 Meta 类中 从表单中排除我想以编程方式填写的字段 但它仍然显示在表单中 以下是代码的一些摘录 Model class Info models Model completed by models For
  • 在linux中链接信号处理程序的正确方法?

    我有几个信号处理程序用来干净地退出程序 并且我想通过链接信号处理程序调用来很好地处理任何其他吸引它们的东西 我在手册页中使用 sigaction 作为信号 表示它不再是首选 查看 sigaction 结构体 其中指定了信号掩码等 以及几个标
  • 内部使用 try catch 防止 C++ DLL 异常

    我正在开发一个 C DLL 为主应用程序分配一个数组 该函数返回错误代码 而不是指向新创建的数组的指针 因此第一个成员的地址将写入函数的参数中 例子 int foo int arrayPtr int array new int 10 arr