Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: CL | DM;

Вниз

Косяк в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-44757
dima_matrix
2003-06-28 21:11
2003.07.14
VC объектные файлы в Delhi


1-44700
elf
2003-06-25 22:40
2003.07.14
Как создать элемент


3-44606
Rel_
2003-06-21 14:18
2003.07.14
SQL


6-44796
bss
2003-05-06 16:30
2003.07.14
Как узнать, кем из пользователей локальной сети заблокирован файл


1-44687
Yuri I. Bououi
2003-06-30 17:33
2003.07.14
использование метода сервера OLE автомации в цикле ...??