Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
3-44595
DimonXP
2003-06-21 10:14
2003.07.14
Соеденение с InterBase через модем


14-44819
Достатый
2003-06-25 23:28
2003.07.14
Забодало. Скупой платит дважды.


6-44778
Staraya
2003-05-06 12:37
2003.07.14
Как мне расшарить ресурс, т.е. (аналог net use)


7-44934
Ал
2003-04-22 15:56
2003.07.14
Работа с ActiveDesktop через CreateComObject


9-44531
Хранитель_7К
2002-12-24 13:44
2003.07.14
Текстурирование сложных обьектов в 3D MAX




   Наверх