Здравствуйте, kmn, Вы писали:
kmn>Здравствуйте, beldmit, Вы писали:
B>>Есть класс CVisit B>> B>>Есть тип CVisitArray — CArray<CVisit, CVisit&> B>> B>>Есть класс CPatient, один из элементов которого — CVisitArray. B>> B>>Есть тип CPatientArray — CArray<CPatient, CPatient&> B>> B>>Один из элементов документа имеет тип CPatientArray. Несколько B>>переменных-членов CVisit и CPatient имеют тип CString и COLEDateTime, B>>остальные — фиксированного размера, указателей нет, поэтому деструкторы B>>пустые. B>> B>>Указатель на документ передается в плагин(dll), который позволяет B>>добавлять/редактировать как пациентов, так и визиты. При добавлении визита B>>все нормально работает, пока не завершается работа приложения. После этого B>>случается Access Violation. Где копать, чтобы его победить?
kmn> kmn>Проблема с наличием двух (или более) диспетчеров памяти.
kmn>в контексте одного диспетчера памяти (dll) объект создается, kmn>а в контексте другог (exe) — грохается.
Не очень понимаю. Чем это отличается от обычной передачи указателя в функцию dll для модификации? Я скорее поверю в какую-то ошибку в конструкторе CVisit, из-за чего в память пишется фигня. На этом форуме я нашел похожую проблему — тогда симптомы ошибки исчезали после убирания virtual из описания деструктора, а сама ошибка была следствием выхода где-то за пределы массива. Код живет дома, вечером проверю.
Если Вы правы, то что с этим предполагается делать? В принципе этот плагин я могу счесть частью основной функциональности и не совать в dll, но нет ли более правильного способа?