2012-06-28 4 views
1

Так вот в чем ситуация.Vector push_back error

У меня есть класс

Class L_FullQuote 
{ 
    private: 
    vector<int> time; 
    .. 
} 

и

Class B 
{ 

    L_FullQuote *Symbols[100]; 

    void handle message() 

} 

Внутри ручки сообщ я есть это заявление

Symbols[i]->time.push_back(2); 

код строит fine..but, когда я использую генерируемое длл. приложение просто сбой .. иногда он приводит меня к ошибке niner poiner в vector..but в основном всего приложения просто падает. Он отлично работает без этой линии.

Пожалуйста, помогите

Благодарности

+2

ли вы когда-либо инициализировать элементы массива 'Symbols', чтобы указать на' объекты L_FullQuote', или вы используете неинициализированные указатели? – cdhowie

+0

Я бы предложил внимательно посмотреть на ответ Чада. Я ответил на ваш вопрос напрямую, но он предлагает лучшее общее решение. –

ответ

1
L_FullQuote *Symbols[100]; 

Здесь вы объявить массив указателей на L_FullQuote, но вы никогда не инициализировать какой-либо из указателей, поэтому, когда вы звоните:

Symbols[i]->... 

Вы разыскиваете неверный указатель. Также обратите внимание, что вы объявили time как частный (хотя ваш код даже не компилировался таким образом, s B как друг AI)?

Просто объявление массива указателей не инициализирует каждый элемент, чтобы указать на действительный объект. Вам необходимо инициализировать каждый из них, например:

for(int i = 0; i < 100; ++i) { 
    Symbols[i] = new L_FullQuote(); 
} 

Только тогда у вас есть массив, полный действительных указателей. Не забудьте освободить их!

+0

Хотя это делает код (как написано) работать, я думаю, что, учитывая неопытность OP, маловероятно, что OP действительно нужен массив из 100 указателей, которые указывают на другое место памяти, но, вероятно, просто нужен массив объектов для использовать. – Chad

+0

@ Chad: Возможно, вы правы, я понятия не имею. Это не помешает упоминать об этом, но, поскольку вы ответили, я не изменю свое. –

2

Вы уже используете vector, так почему бы не сделать это на один шаг дальше? Использование std::vector позволит вам сосредоточиться на написании вашей функциональности, а не беспокоиться об управлении памятью.

Этот пример немного отличается от того, что вы изначально разместили. В исходном классе вопросов B имеется массив из 100 указателей, каждый из которых должен быть инициализирован. В приведенном ниже примере мы создаем std::vector объектов L_FullQuote, размер которых первоначально составляет 100 объектов в конструкторе.

class L_FullQuote 
{ 
public: 
    vector<int> time; 
}; 

class B 
{ 
public: 
    // Initialize Symbols with 100 L_FullQuote objects 
    B() : Symbols(100) 
    { 
    } 

    std::vector<L_FullQuote> Symbols; 

    void handle_message() 
    { 
     Symbols[i].time.push_back(2); 
     // other stuff... 
    } 

}; 
+0

+1 лучшее общее решение –

-1

время является частным членом класса L_FullQuote из класса B не имеют доступа к этой области

+0

Это ошибка компилятора. – chris

Смежные вопросы