То, что вам нужно искать, используя Dependency Walker (который предлагает Патрик), это разные версии библиотек времени выполнения msvc (msvcrt и друзья), и если они используются разными библиотеками DLL, которые обмениваются памятью между ними.
Это важная часть, так как куча хранится в dll времени выполнения, каждая среда выполнения будет иметь свою собственную кучу (т.е. для 2008, 2010, 2005).
Таким образом, если вы выделите память в одной dll (скажем, путем создания std :: string с более чем 16-ю символами) и отправите ее в другую dll, где она умрет (в конце области видимости), вызов delete будет перейдите в другую кучу, отличную от той, где она была новой: ed, и последует сбой.
Таким образом, для совместимости STL между библиотеками DLL в Windows должен использоваться один и тот же компилятор.
Если DLL предоставляет API, где она всегда может освободить свою собственную память, такой проблемы нет. (то есть, думаю, COM или что-то похожее, но менее отвратительное).
Могут также быть несовместимости ABI, но я не уверен в них. На протяжении многих лет меня больше всего беспокоили проблемы с выделением / освобождением памяти.