Вызов нового несколько раз в течение цикла for - PullRequest
1 голос
/ 19 июля 2011

Вот небольшой фрагмент моего кода для анализа файлов PDB для моделирования молекулярной динамики:

Structure *s = new Structure(pdb_filename);
Chain     *c = new Chain();

while( ... read file ... ) {
    if ( ... new chain ... ) {
        Chain *c = new Chain();
        s->add_child(c);        // Add reference to a vector to 
                                // save the Chain for later
    }
}

Когда вызывается содержащая функция, код работает как обычно и дает совершенно новые объекты Structure и Chain, как в первых двух строках фрагмента.

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

Будет ли g ++ давать один и тот же указатель снова и снова? Есть ли способ обойти это? Если я добавлю указатель c к дочернему вектору 's', я предполагаю, что вызов delete c вызовет еще большие головные боли?

Ответы [ 3 ]

7 голосов
/ 19 июля 2011
Structure *s = new Structure(pdb_filename);
Chain     *c = new Chain();

Вы только что определили c здесь

while( ... read file ... ) {
    if ( ... new chain ... ) {
        Chain *c = new Chain();

Вы только что определили c здесь снова затемнение другого.

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

Теперь, какую из двух вы смотрите?

Я думаю, вы уже видите проблему.

5 голосов
/ 19 июля 2011

код возвращает тот же Цепной указатель на объект, что и раньше

В это трудно поверить.

Будет ли g ++ давать тот же указатель иболее?

Нет.Каждый раз, когда вы звоните new Chain, это другой Chain.Это другой указатель, указывающий на другую память (вот почему это new).Он также затеняет c до while.

3 голосов
/ 19 июля 2011

new Chain () должен давать каждый раз новый указатель

Я думаю, у меня может быть какое-то подозрение, в чем ваша проблема -

C в вашем цикле не относится к тому жепеременная как c за пределами вашего цикла.C за пределами вашего цикла будет сохранять свое значение на протяжении всего пути.

...