Форум: "Потрепаться";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];
ВнизКосяк в BCB5 при использовании stl Найти похожие ветки
← →
greymouse (2003-06-29 00:52) [0]Привет,
Пришлось столкнуться с проблемой. Под заказ написана компонента с
использованием stl"евского vector"а. Проблема в том, что код, работающий в
BCB5 Enterprise отказывается корректно работать в BCB5 Standart. Ошибка
вываливается в memory.stl при попытке копирования свойства компонента из
вызваной формы в вызвавший его модуль (что-то в духе приведенного примера).
Standart вылетает с A/V, а Enterprise корректно все отрабатывает. В рамках
одной формы Standart так же работает как надо. Никто не сталкивался с
подобным?
greymouse
PS: прошу прощение за постинг о bcb, но возможно подобная проблема была у кого-то и с delphi
← →
Suntechnic (2003-06-29 06:55) [1]Трудно давать советы по столь жидкому описанию и не видя кода, но... если где-нибудь в коде происходит передача (или возврат) вектора в модуль по значению или же происходит модификация переданного вектора (если он передан по ссылке или указателю) где-либо в самом модуле, то это потенциальный источник трудноотлавливаемых ошибок. Проверьте свой код на соответсвие тому, что я написал и если найдёте хоть одно такое место, меняйте логику. Корректно работать это никогда не будет.
← →
greymouse (2003-06-29 11:24) [2]да, обвал происходит при передаче вектора. Однако интересно чем таким обладает enterprise версия билдера, чего нет в стандарт поставке и что мешает корректно отрабатывать код. "Чего нет" приминительно к данной ситуации разумеется.
А пример я действительно забыл запостить. Если он поможет, то вот он:
int btLocal;
Form2 = new TForm2(Application);
try
{
btLocal = Form2->ShowModal();
TMyComponentProperty * pcs = new TMyComponentProperty(Form2->MyComponent->MyComponentProperty);
}
catch(...)
{
Form2->Free();
}
на объявлении pcs и огребаю a/v
← →
Suntechnic (2003-06-29 20:02) [3]>greymouse (29.06.03 11:24)
Ничем особенным версия Enterprise не обладает. А корректно обрабатывать мешает тот факт, что неизвсетно какая версия (статическая или DLL) run-time библиотеки C/C++ используется в приложении и в модуле. Чтобы избежать подобных проблем, при работе с модулями надо усвоить одно простое правило: где память размещается, там она и должна уничтожаться.
Если говорить о конкретном коде, то сказать однозначно, нарушает ли он данное правило, нельзя потому как не видно что есть Form2->MyComponent->MyComponentProperty (т.е. понятно, что это вектор, только непонятно из каких элементов он состоит)... но очевидно другое. При передачи вектора по значению будет вызван копи-конструктор (если только MyComponentProperty не указатель и не ссылка на вектор), который создаст копию елементов вектора (т.е. размещение памяти в одном модуле). А вот уничтожение этой копии будет происходить при выходе из области видимости конструктора TMyComponentProperty т.е. в другом модуле. Вот в этом, судя повсему и есть загвоздка.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c