| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > объект исчезает после обращения к нему |
| Автор: ragzovskii 13.4.2010, 18:20 | ||||||
| пишу на Visual C++ программу, работающую с СУБД Cache. чтобы позволить С++ работать с объектами из БД, Cache создает классы-проекции, в которых определены типы d_vector, d_obj_vector и так далее. в общем все, что начинается с d_ Controller.h
Controller.cpp
Treemode.cpp
после вызова функции Controller::generateTree() попытка вызвать cVector->size() дает access violation. не хотелось бы каждый раз заполнять этот вектор из БД. не подскажете решение? заранее спасибо |
| Автор: ragzovskii 13.4.2010, 19:14 |
| если верить http://vista.intersystems.com/csp/docbook/DocBook.UI.Page.cls?KEY=GCPP_using, то: C++ library comes with a template class, d_ref<>, that encapsulates the behavior of references to proxy classes. An instance of d_ref<T> is a smart pointer to a proxy object of type T. This means that you can Call methods of the proxy object using the “->” (pointer) operator. Copy one d_ref<> to another. The two d_ref<> instances will point to the same proxy object. Pass a d_ref<> as an argument to a proxy method that may change the d_ref<> to point to another proxy object. |
| Автор: mes 13.4.2010, 20:04 | ||||
ну а как дело обстоит у d_ref с деструктором ? чтоб проверить предположение можете изменить
на
изменилось ли поведение после исправления ? |
| Автор: ragzovskii 13.4.2010, 20:17 |
| ничего не изменилось. добавил в .h и .cpp, передаваемое значение оставил прежним. ошибок компиляции нет, access violation есть |
| Автор: mes 13.4.2010, 20:25 |
ну а если закомментируете вызов generateClTree AV остается ? |
| Автор: ragzovskii 13.4.2010, 20:34 | ||
| нет. AV возникает после второго обращения. например:
даже после такого использования возникает AV при обращении к cVector в следующей функции. |
| Автор: jonie 13.4.2010, 21:29 |
| есть подохрение что так cVector->operator [](i) делать не стоит.. возможно в cVector перегружен operator* ? В общем мое имхо: смотреть stack call стоя на AV ... |
| Автор: mes 13.4.2010, 21:46 | ||||
а если упростить ?
и проверьте чему равен cVector в точке 1. и 2. |
| Автор: ragzovskii 14.4.2010, 07:12 | ||
Код немного другой :
и AV не появляется, cVector содержит то, что должен |
| Автор: mes 14.4.2010, 08:46 |
ах.. да..запарился.. исправил интересно.. т.е. AV появляется только при вызове generateClTree ?. ну тогда методом научного тыка можете определить какое из трех использований губит вектор.. |
| Автор: ragzovskii 14.4.2010, 09:10 |
| вектор губит завершение работы функции. он ведет себя как локальная переменная. и я никак не пойму почему |
| Автор: mes 14.4.2010, 10:10 |
ну значит первое предположение о причине в передаче параметров верно. смущает то, что Вы пробовали уже передавать по ссылке и не изменилось.. |
| Автор: ragzovskii 14.4.2010, 18:59 |
| Онотоле вбил немного разума в мою голову и показал мне где я сделал ошибку. В конструкторе класса, имеющего поле типа Controller я вместо controller = new Controller(conn); написал Controller controller(conn); |
| Автор: kemiisto 14.4.2010, 19:24 |
| No comments. (с) BBC Понятно, конечно, что если б видеть вес код, гадать на кофейной гуще бы не пришлось. Но всё равно доставило, спасибо. ragzovskii, ты не пробовал использовать http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6? С ними такого не было. Я так себя приучил: добавил новый данное-член |