【发布时间】:2018-01-11 19:51:34
【问题描述】:
我想知道我试图将向量从 DLL 返回到 .exe 应用程序的情况。 DLL 和 .exe 应用程序的编译器和设置是相同的。我知道在分配/释放内存的情况下,通过 DLL 边界传递 STL 向量可能会导致内存错误。
返回由shared_ptr 包裹的vector 的情况如何?这个内存安全吗?
小例子:
导出的DLL方法:
__declspec(dllexport) std::shared_ptr<std::vector<MyObject>> MyDLL::myMethod()
{
//Create object
MyObject obj;
std::vector<MyObject> myVector;
myVector.push_back(obj);
//Create wrapper
std::shared_ptr<std::vector<MyObject>> spvObject = std::make_shared<std::vector<MyObject>>(myVector);
return spvObject;
}
在 .exe 端获取此数据:
MyDll dll;
std::shared_ptr<std::vector<MyObject>> objFromDll = dll.myMethod();
当 .exe 应用程序的指针超出范围时会发生什么?从DLL中删除堆会不会出现内存错误?
【问题讨论】:
-
已编辑,错误见谅。
-
然后,除了在堆栈上创建临时对象和临时向量之外,鉴于
MyObject具有适当的复制/移动构造函数,并且调用者和 dll 的编译器/设置相同,这段代码就可以了。此外,由于(至少在此代码 sn-p 中)所有权实际上并未共享而是转移,因此使用unique_ptr会更好。 -
DLL 是否在内部使用创建的向量?根据示例,您可以按值返回向量。
-
@TaylorHansen,在这种情况下,当来自 .exe 的
vector超出范围时,我的应用程序崩溃了。当我使用unique_ptr. Only withshared_ptr' 时也会发生同样的情况。 -
那么
MyObject类很可能有问题,很可能缺少/错误的构造函数和赋值运算符。
标签: c++ vector dll stl shared-ptr