Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
1

Непонятное поведение list, vector в другом классе

15.07.2013, 16:03. Показов 691. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Салют.

C++
1
2
3
4
5
6
7
8
9
10
class _auxObserver {
        ---
    list<gmObjBase*> mObservedObj;
    vector<int> b;
 
public:
    _auxObserver();
    
    void add(gmObjBase* obj);
        ---
и реализация этой части:
C++
1
2
3
4
5
6
_auxObserver::_auxObserver() {};
    
void _auxObserver::add(gmObjBase* obj) {
    //mObservedObj.push_front(obj);
    b.push_back(0);
};
Так вот, в функции add программа падает... именно в push_back, insert и тп. Я думал что-то не так с моим gmObjBase, но даже для int падает. А если объявить b как указатель на вектор(или list), то все работает.
первый раз с таким поведением сталкиваюсь, раньше все прекрасно работало. Думал - может оно исключение выбрасывает, ан нет...программа просто завершает работу без указания ошибок.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2013, 16:03
Ответы с готовыми решениями:

Различное поведение vector vs list и/или их итераторов
Всем добрый вечер! Вот код, который меня удивил. Тут создаётся двумерная структура, вроде ...

Непонятное поведение
Всем привет! В книге &quot;Прата - Язык программирования C++. Лекции и управжения 2011&quot; нашёл вот такой...

Непонятное поведение программы
Привет народ, вот кароч: #include&quot;stdafx.h&quot; #include&quot;iostream&quot; using namespace std; class calc{...

Непонятное поведение функтора
Почему-то не считается произведение 1 и 6 ... #include &lt;iostream&gt; #include &lt;algorithm&gt;...

2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.07.2013, 17:05 2
monolit, попробуйте минимально возможную программу сделать, которая будет падать.
На первый взгляд проблем быть не должно. Но не видно как осуществляется вызов add(), может быть через указатель, который есть nullptr? И может и в другом месте проблемы, а сказывается при вызове add().
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
15.07.2013, 17:29  [ТС] 3
Возник такой вопрос: может ли при текущем определении _auxObserver'а неправильно работать оператор присваивания по умолчанию? И еще. Ниже класс матрицы, в которой я вначале пытался хранить этот _auxObserver напрямую, т.е. gmMatrix<_auxObserver> -- не работало. но gmMatrix<_auxObserver*> работает ка надо, и insert и push_bask корректно себя ведут. Где может быть это узкое место, из-за которого это происходит?)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
template<typename T>
class gmMatrix {
    T** mData;
    int mWidth, mHeight;
 
    inline void destroy() {
        if (mData) {
            for(int i = 0; i<mWidth; ++i) delete[] mData[i];
            delete[] mData;
            mData = 0;
        }
    };
    inline void create(int width, int height, const T& val) {
        mData = new T*[width];
        for(int i = 0; i<width; ++i) {
            mData[i] = new T[height];
            for(int j = 0; j<height; ++j) mData[i][j] = val;
        }
        mWidth = width;
        mHeight = height;
    };
public:
    gmMatrix(): mData(0), mWidth(0), mHeight(0) {};
    gmMatrix(const gmMatrix<T>& matrix): mData(0) {
        mWidth = matrix.mWidth;
        mHeight = matrix.mHeight;
        mData = new T*[mWidth];
        for(int i = 0; i<mWidth; ++i) {
            mData[i] = new T[mHeight];
            for(int j = 0; j<mHeight; ++j) mData[i][j] = matrix.mData[i][j];
        }
    };
    gmMatrix(int width, int height, const T& val = 0): mData(0) {
        create(width, height, val);
    };
    ~gmMatrix() {
        if (mData) {
            for(int i = 0; i<mWidth; ++i) delete[] mData[i];
            delete[] mData;
        }
    };
 
    gmMatrix<T>& operator = (const gmMatrix<T>& matrix) {
        if (this == &matrix) return *this;
 
        destroy();
        mWidth = matrix.mWidth;
        mHeight = matrix.mHeight;
        mData = new T*[mWidth];
        for(int i = 0; i<mWidth; ++i) {
            mData[i] = new T[mHeight];
            memcpy(mData[i], matrix.mData[i], sizeof(T)*mHeight);
        }
        return *this;
    };
 
 
    inline int height() const {
        return mHeight;
    };
    inline int width() const {
        return mWidth;
    };
 
 
    inline T& operator () (int i, int j) {
        return mData[i][j];
    };
    inline const T operator () (const ipair& point) const { 
        return mData[point.first][point.second];
    };
    inline const T operator () (int i, int j) const {
        return mData[i][j];
    };
};
Вот такие дела... Грешу на оператор присваивания и sizeof(T)(авось ему размер точно неизвестен, хотя вроде все должно быть нормально), больше хз. A add вызывается для элемента этой матрицы.
0
15.07.2013, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2013, 17:29
Помогаю со студенческими работами здесь

Непонятное поведение программы
Пишу статическую либу. В ней есть кусок кода, который уходит в рекурсию.. Только причины мне...

Непонятное поведение простой функции
Решал одну задачу на рекурсию, долго не мог добится результата пока не понял что проблема не в...

Непонятное поведение rvalue/lvalue
Всем привет, объясните, пожалуйста, немного про р-вэлью и л-вэлью в этом коде: #include &lt;iostream&gt;...

Непонятное мне поведение функции
Эта функция себя странно ведёт. Она работает и если с первого раза ввести цифры с клавиатуры, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru