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

Error reading vector elements via a pointer which has the base address of the vector

本文关键字:指针 读取 元素 出错      更新时间:2023-10-16

我的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,然后在读取非 null 的内存时引发异常。

p

本身不会等于NULL。无法准确判断,因为提供的代码缺少指针定义pICSClient::SampleMethod2调用,但在这里您正在读取数组,然后超出数组的范围,这就是未定义的行为。

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

我看到您在此处返回一些代码,这可能是一个要求,因此您无法返回 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;
}

请注意,用户必须自己管理内存(删除阵列),这不是真正的预期行为。