通过具有矢量基址的指针读取矢量元素时出错
Error reading vector elements via a pointer which has the base address of the vector
我的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
。无法准确判断,因为提供的代码缺少指针定义p
ICSClient::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;
}
请注意,用户必须自己管理内存(删除阵列),这不是真正的预期行为。
相关文章:
- 分段错误 - 读取初始化指针的数组
- 函数如何读取指针?
- 通过指针读取文件
- 如何读取指针的值,因为这个指针是函数的返回?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 为什么不读取带有指针的结构?
- C++指针将内存读取为 0
- 使用智能指针读取访问冲突
- 从字节指针读取位的差异
- 通过具有矢量基址的指针读取矢量元素时出错
- 在Linux中,多个进程使用文件指针读取文件时使用的共享虚拟内存
- 尝试从插入的.dll中的指针读取字符串时出现Segfault
- 使用指向成员的指针读取 cons 对象的字段的值
- 有关要从结构指针读取的代码的简单代码
- 如何使用指针读取 nxn 矩阵
- 从无效指针读取--relpret_cast可以
- 从指针读取一个容器结构
- 通过指针读取多维数组或向量安全吗
- 如何从指针读取字节序列C++一样长