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

C++ 通过具有向量基址的指针读取向量元素时出错,c++,pointers,stl,C++,Pointers,Stl,我的exe正在访问dll分配的向量。我通过vector.data获取基址。问题是向量可能分配了比所需更多的内存空间。那么如何读取分配了实际数据的内存呢 .dll代码 Utf8String ICSClient::SampleMethod2(Utf8String* &p) { vector<Utf8String> *temp = new vector<Utf8String>; temp->push_back("Liu"); te

我的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;
}

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

为什么不返回向量呢?修改传入的参数以指向已在堆上分配的内容看起来像是一种正确的代码味道。至少还需要返回向量的大小,但是,正如@super编写的那样,最好的方法就是返回对向量的引用。我不返回引用,因为我不确定在本机代码中使用dll时,它是否会支持STL。我认为@Rotem建议最好添加一个参数来同时返回向量的大小,但是,如果由于某种原因,这是不可行的,您可以使用一个哨兵值(如空字符串)作为向量的结尾吗?您还应该担心分配和解除分配的机制与dll到exe的机制匹配,但您似乎忽略了泄漏。避免dll和exe之间的所有权传输更安全。我可能无法将std::vector作为引用传递,因为我的dll可能被本机代码使用,并且我不确定本机代码是否支持STL。我正在Microsoft Visual Studio上构建dll我编辑了答案,但您似乎已经找到了答案:因为我的代码可能用于本机应用程序,所以我担心vector的可用性。因为我的应用程序是在.net中创建的。我找到的解决方案是让用户传递一个指针引用,这样当dll被使用时,dll将初始化dll用户传递的指针引用,然后用户将必须负责内存管理。由于dll也适用于本机应用程序,因此无法使用其他解决方案:很抱歉,回复晚@Yksisarvinen
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;
}