我有一个使用MSVCRT静态链接的C++库,我希望任何人都能够在任何版本的MSVC运行库中使用我的库。要实现这个目标,最好的方法是什么?
我已经非常小心地处理了各种情况:
- 内存不会跨DLL边界释放
- 运行时C++对象不会跨边界传递(即向量、映射等,除非它们是在该边界的一侧创建的)
- 不会在边界之间传递文件句柄或资源句柄
然而,我仍然有一些简单的代码会导致堆损坏。
我在我的库中有这样一个对象:
class Foos
{
public: //There is an Add method, but it's not used, so not relevant here
DLL_API Foos();
DLL_API ~Foos();
private:
std::map<std::wstring, Foo*> map;
};
Foos::~Foos()
{
// start at the begining and go to the end deleting the data object
for(std::map<std::wstring, Foo*>::iterator it = map.begin(); it != map.end(); it++)
{
delete it->second;
}
map.clear();
}
然后我在我的应用程序中像这样使用它:
void bar() {
Foos list;
}
从任何地方调用此函数后,会出现关于堆栈破坏的调试警告。如果我真的让它运行到底,它实际上会破坏堆栈并导致段错误。
我的调用应用程序使用Visual Studio 2012平台工具编译。库使用Visual Studio 2010平台工具进行编译。
这是我绝对不应该做的事情,还是我实际上正在违反使用多个运行时的规则?
map
字段(因为它不是指针),然后将其析构。这显然会导致堆栈损坏。如果我将目标降级到VS2010并以这种方式构建我的应用程序,则可以正常工作。 - Earlz