C++ - CORBA::LongSeq 至长*

C++ - CORBA::LongSeq to long*

我是 C++ 的新手(我通常在 Java 上工作),我正在尝试将 ::CORBA::LongSeq 对象转换为 C++ 中的 long *,以便执行操作之后就可以了。

所以基本上,我尝试的是这样做:

long * Sample (const ::CORBA::LongSeq& lKeys) {
    long nbElts = lKeys.length();
    long * lCles = NULL;
    for(int iIndex = 0; iIndex < nbElts; iIndex++) {
        lCles[iIndex] = (long) lFCKey[iIndex];
    }
return lCles;
}

发生的事情是我可以检索 lKeys 的长度(据我所知,它应该在正确的位置),但后来我得到了当我进入 for 循环时出现访问冲突异常。

0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF

虽然我不确定我做错了什么...有人有想法吗?

这里有两处错误。

1) 您在初始化之前尝试使用 lCles:

long * lCles = NULL;
..
lCles[iIndex]

这会导致 for 循环内的访问冲突。

2) 你 return 一个只在本地声明的指针 lCles:

return lCles;

这意味着它在函数退出时超出范围,然后变为无效。

这是一种解决方案,您不会因指针而陷入困境:

#include <vector>

std::vector<long> Sample (const ::CORBA::LongSeq& lKeys) 
{
    long nbElts = lKeys.length();
    std::vector<long> lCles(nbElts);
    for(int iIndex = 0; iIndex < nbElts; ++iIndex) 
        lCles[iIndex] = (long) lFCKey[iIndex];
    return lCles;
}

如果元素数量正确,这保证可以正常工作。

既然你说你知道 Java,那么 std::vector<long> 就相当于一些存储值序列的 Java 容器。例如,您可以获得 return 值并调用向量的 data() 函数来获得指向向量内部缓冲区的 long *

但总的来说,远离指针业务(或尝试限制它们的使用)。

编辑:注释声明使用 CORBA::Long。所以这里是:

std::vector<CORBA::Long> Sample (const ::CORBA::LongSeq& lKeys) 
{
    long nbElts = lKeys.length();
    std::vector<CORBA::Long> lCles(nbElts);
    for(int iIndex = 0; iIndex < nbElts; ++iIndex) 
        lCles[iIndex] = lFCKey[iIndex];
    return lCles;
}

Java和C++的区别在于你必须自己管理你的内存(在大多数情况下)。

您得到的错误是您尝试将事物分配给未初始化的变量 (lCles),并返回局部变量。离开方法后,存储在堆栈中的局部变量 lCles 将变为 "destroyed"。

关于如何做到这一点的一个建议可能是这样的:

long* lCles = new long[lKeys.length()];
for(int iIndex = 0; iIndex < nbElts; iIndex++) {
    lCles[iIndex] = (long) lFCKey[iIndex];
}
return lCles;

调用此代码的方法中的重要部分是通过执行以下操作释放此 lCles 持有的内存

delete [] lCles; // or whatever the name of the variable is.

完成后。

像这样:

long * l = Sample(lkeys);
// Do your stuff here
delete [] l;

(使用另一个答案中建议的 std::vector 实际上是首选,因为您不必自己进行内存管理。)