И така, имам C++ библиотека със статично свързано копие на MSVCRT. Искам всеки да може да използва моята библиотека с всяка версия на MSVC Runtime. Какъв е най-добрият начин за постигане на тази цел?
Вече доста внимавам как се правят нещата.
- Паметта никога не преминава 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 и създам приложението си по този начин, то работи добре - person Earlz   schedule 14.11.2013