在vc++中使用vector后release版本的dll被debug的exe调用后出现异常

问题描述:
生成的dll接口使用了std::vector,调用dll的程序与dll不是发布版本(dll是release,exe是debug;或dll是debug,exe是release),出现vector调用异常。


项目代码链接:vcpp-vector-export


dll导出接口:

struct Key{
	char * key;
	int keySize;
};

/* 设备日志回调 */
typedef void(__cdecl *DevLogCallBack)(const int lLoginID, int nLogType, std::vector<Key> keys, int nkeysSize);

int test(int nSize, DevLogCallBack cb);

在调用dll时,若dll和exe都为release,或者都为debug则没有问题;若两者发布版本不同则一定出问题。

查询msdn,发现是Checked Iterators的问题导致的。
可以将_SECURE_SCL设置为0禁用Checked Iterators。更好的方式是修改_ITERATOR_DEBUG_LEVEL的值来修改_SECURE_SCL,设置Checked Iterators设置,使stl迭代器是否为调试模式。

在源文件中,在定义迭代器的任何标准库头之前指定_ITERATOR_DEBUG_LEVEL宏。

解决办法

不要在导出函数中使用stl中的类型,在不同的编译器中stl的实现可能不一样,会导致各种问题。最好的办法就是导出简单的类型,例如:语言自带的int、char、float等,或者使用c结构体,链表等自定义的简单类型。

你可能感兴趣的:(C/C++)