跨版本vs调用生成的dll引发的问题

最近在做一个项目开发的时候,碰到了如标题所示的怪事,这种事情直到现在也没有完全搞明白是怎么回事,只是推测大概和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

猜你喜欢

转载自blog.csdn.net/autumoonchina/article/details/80014514