Сумасшедшая std::map.
От: vbez  
Дата: 14.03.03 17:46
Оценка:
Есть такой код:

DLL
typedef std::map<int, int> MadMap;
class TEST_EXT_CLASS MyClass  
{
public:
    void Check(MadMap& myMap);
};

void MyClass::Check(MadMap& myMap)
{
   myMap[1] = 10;
   myMap[3] = 30;
   myMap[5] = 50;
}


Клиент

MadMap myMap;
myMap[1] = 0;
myMap[3] = 0;
myMap[5] = 0;

MyClass cls;
cls.Check(myMap);


Когда управление переходит в MyClass::Check, то выполняется только первая строчка.
На myMap[3] = 30; — Access Violation.

Я что-то неправильно делаю???
Если все правильно, то можно ли это обойти честными способами — без правки stl-эвских файлов.

Статью "Заметка о некоторых особенностях использования STL в DLL".
Роэтому ссылаться на нее не стоит.
Меня интересует четкий ответ — да||нет и как.

Владимир Безуглый.
Re: Сумасшедшая std::map.
От: Кодт Россия  
Дата: 14.03.03 18:09
Оценка:
Здравствуйте, vbez, Вы писали:

<>

Вот гипотеза.
std::map, будучи сделанным на std::tree, имеет статический член-данное (это по версии STL от Dinkumware) -- _Nodeptr _Nil.

Естественно предположить, что у длл и клиента окажутся по своему экземпляру этой переменной.
Вот они и подрались.
Перекуём баги на фичи!
Re: Сумасшедшая std::map.
От: Sergeem Израиль  
Дата: 16.03.03 13:58
Оценка:
Здравствуйте, vbez, Вы писали:

[skip]

V>Когда управление переходит в MyClass::Check, то выполняется только первая строчка.

V>На myMap[3] = 30; — Access Violation.

V>Я что-то неправильно делаю???

V>Если все правильно, то можно ли это обойти честными способами — без правки stl-эвских файлов.

Вы делаете абсолютно правильно.
Законный способ обойти эту проблему — взять другой stl + ms-crt в отдельной dll.
StlPort рулит, например. Переход обычно проходит нормально, только с auto_ptr геморрой.


V>Статью "Заметка о некоторых особенностях использования STL в DLL".

V>Роэтому ссылаться на нее не стоит.
V>Меня интересует четкий ответ — да||нет и как.

V>Владимир Безуглый.
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.