gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:37 43 4
gpt4 key购买 nike

我正在开发一个为主应用程序分配数组的 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 block

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

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

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

谢谢大家!

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

最佳答案

假设您使用的是 VC++,try..catch 默认情况下不会捕获访问冲突,因为默认异常处理模型仅捕获同步 异常并且访问冲突是 < em>异步异常。这记录在这里:/EH (Exception Handling Model)

如果您将项目设置更改为使用 /EHa 而不是 /EHsc 那么您的 try..catch 将捕获访问冲突。

也就是说,为什么不显式检查 NULL?使用异常进行流量控制是糟糕的形式。

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

关于c++ - 在内部使用 try catch 防止 C++ DLL 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951987/

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