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 实际上是首选,因为您不必自己进行内存管理。)
我是 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 实际上是首选,因为您不必自己进行内存管理。)