【问题标题】:C++ - CORBA::LongSeq to long*C++ - CORBA::LongSeq 到 long*
【发布时间】:2015-11-16 15:33:28
【问题描述】:

我是 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:访问冲突读取位置0xFFFFFFFFFFFFFFFF

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

【问题讨论】:

  • 1) 返回指向局部变量的指针是未定义的行为。 2)你的指针是NULL。你希望用 NULL 指针做什么?
  • 看起来像一个无效的指针
  • I'm new to C++ (I usually work on Java), 但是您错过了指针管理的基本原理。使用std::vector&lt;long&gt; 而不是long *。然后所有这些变成一两行。
  • @PaulPicard 您正在访问一个 NULL 指针。不管是读还是写。但最重要的是,您的代码试图将数据填充到指向......我们不知道的指针中。这就是问题所在。让它指向一个足够大的缓冲区来保存数据。
  • @PaulPicard because all the treatment is done afterwards in C C++ 没有范围解析运算符,但您的函数原型有。因此,凭直觉,它肯定看起来不像是从 C 模块调用的。

标签: c++ pointers corba


【解决方案1】:

这是一种解决方案,您不会因为指针而陷入混乱:

#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&lt;long&gt; 将等同于一些存储值序列的 Java 容器。例如,您可以获取返回值并调用向量的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;
}

【讨论】:

  • 假设CORBA::Long == long是不正确的,应该是std::vector<:long>
  • 我会选择专用的转换函数,而不是携带 CORBA 类型并进入其他层。
  • IDL 到 C++11 语言的映射不使用特定的 CORBA 类型,它使用 cstdint 中定义的 C++11 类型,这将消除将 CORBA 类型转换为标准的需要类型
【解决方案2】:

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

您得到的错误是您尝试将事物分配给未初始化的变量 (lCles),并返回一个局部变量。退出方法后,存储在堆栈中的局部变量lCles 将被“销毁”。

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

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,因为您不必自己进行内存管理。)

【讨论】:

    【解决方案3】:

    这里有两个问题。

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

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

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

    2) 你返回一个指针 lCles,它只在本地声明:

    return lCles;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多