【发布时间】:2018-08-23 21:35:10
【问题描述】:
我的 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的内存时抛出异常。
【问题讨论】:
-
为什么不返回向量?修改传入的参数以指向在堆上分配的东西看起来像是一种正确的代码气味。
-
至少您还需要返回向量的
size,但正如@super 所写,最好的办法就是返回对vector的引用。 -
我没有返回引用,因为我不确定在本机代码中使用 dll 时是否支持 STL。
-
我认为@Rotem 提出了最好的建议(添加一个参数来返回向量的大小),但如果由于某种原因不可行(?),你可以使用一个哨兵值比如空字符串作为向量的结尾?
-
您还应该担心 分配和解除分配 发生的机制从 dll 到 exe 匹配,但您似乎忽略了泄漏。避免在 dll 和 exe 之间进行任何所有权传输会更安全。