我正在开发一个 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(使用前将#替换为@)