通过具有向量基址的指针读取向量元素时出错

时间:2018-03-15 06:58:11

标签: c++ pointers stl

我的exe正在访问dll分配的向量。我通过vector.data()获取基地址。问题是向量可能分配的内存空间超过了所需的内存空间。那么我如何读取具有实际数据分配的内存。

.dll代码

Utf8String ICSClient::SampleMethod2(Utf8String* &p) 
    {
    vector<Utf8String> *temp = new vector<Utf8String>;
    temp->push_back("Liu");
    temp->push_back("Roy");
    temp->push_back("Shanu");

    p = temp->data(); // returns the pointer to the underlying array

    return success;
    }

.exe代码 // ----- p是一个分配了向量基址的指针

while (p != NULL)
     {
      cout << *p << endl;
      p++;
     }

看起来p不等于null,然后在读取非空的内存时抛出异常。

1 个答案:

答案 0 :(得分:1)

p本身不会等于NULL。无法确切地说,因为提供的代码缺少p指针定义和ICSClient::SampleMethod2调用,但是在这里你正在读取数组,然后你超出了数组的范围,即Undefined Behaviour

也存在内存泄漏,因为你永远不会释放为vector分配的内存,并且在函数结束时会丢失指向它的指针。

我看到你在这里返回一些代码,这可能是一个要求,所以你不能返回向量。我建议通过引用传递std::vector,这样你就可以在函数中使用它了

Utf8String ICSClient::SampleMethod2(std::vector<Utf8String>& data) 
{
    data.clear();
    data.push_back("Liu");
    data.push_back("Roy");
    data.push_back("Shanu");

    return success;
}

编辑:如果通过引用传递std::vector不可行,那么您(以及您的dll的用户)将不得不处理原始C数组。不幸的是,当将数组传递给函数时,它会降级为指针类型,因此必须将大小与数组一起传递

Utf8String ICSClient::SampleMethod2(Utf8String** data, size_t* size) 
{
    *size = 3;

    *data = new Utf8String[3];
    data[0] = "Liu";
    data[1] = "Roy";
    data[2] = "Shanu";

    return success;
}

请注意,用户必须自己管理内存(删除数组),这实际上不是预期的行为。