最近在做一个项目开发的时候,碰到了如标题所示的怪事,这种事情直到现在也没有完全搞明白是怎么回事,只是推测大概和vs的版本有关,不同的版本对于stl的内存处理不同吧。
具体表现是这样的。
我用vs2010编写了一个函数,函数的接口如下。
DLL_API int MergeAllRrlxs(OmParameters op, const std::vector<std::string>& vRrlxDirs);
一般来说,stl并不适合作为接口,但是因为这个项目中,我传入的vector是只读的,不存在内存再次分配的问题,所以我觉得没问题,然而我似乎还是太天真了。
这个vector传入到dll中后,我只进行了读取操作,在vs2010编写的应用程序下调用该dll没有任何问题,但是当我把这个dll发给同事之后,他用vs2015编写的应用程序调用,则直接崩溃。
经过调试,我们发现崩溃的位置在dll内部这句话:
std::vector<std::string> vRrlxDirsBak(vRrlxDirs);;
这本来是一个简单的构造语句,不应当出问题,于是我把这句话改成
std::vector<std::string> vRrlxDirsBak = vRrlxDirs;
问题依旧,其实也不奇怪,因为这两句话本质一样,通过一个vector构造另外一个vetor,想到这里,我发现一个问题,vRrlxDirs传进来的参数是有const修饰的,这难道会出问题?抱着不可思议的想法,我改变成如下代码。
std::vector<std::string> vRrlxDirsBak;
size_t nRrlxDirNum = vRrlxDirs.size();
for(size_t i= 0; i < nRrlxDirNum;++i)
{
vRrlxDirsBak.push_back(vRrlxDirs[i]);
}
不崩溃了!
于是就有了这样的认识,在vs2015调用vs2010编写的dll中的vetor变量的时候,const vector不能直接赋值给vector,但是这个中的原因到底是什么,不得而知,如果有人知道能帮忙告知一下呢?
========分割线============
测试一段时间之后,问题依然出现!!
开始怀疑是接口的问题,更改为C接口,去掉stl的相关参数
extern "C" __declspec(dllexport) int MergeAllRrlxsEx(constchar*pDstRrlxDir, const int nRrlxType, void(*pOutFun) (const char* lpszFormat, ...), char** ppRrlxDirs,const int nRrlxDirNum);
经过测试,目前暂未发现问题。
同事怀疑说是不同平台stl的实现不同,为了提高兼容性,要写成extern "C"接口,目前暂不确定原因到底为何,但是这么做总算是避免了问题。
更多的交流,欢迎加入 暗号271888395