2012-03-07 3 views
0

Я работаю с std::vector, чтобы удерживать некоторые объекты, у которых есть динамически распределенные элементы, и когда я иду, чтобы помещать Вещи в вектор, происходит несколько вещей, которые я не понимаю.C++ проблемы с вектором

  1. Я называю push_back() и использовать конструктор объектов в качестве аргумента, но по какой-то причине он идет в деструкторе объекта. почему это; он должен добавить не удаление?

  2. Я вызываю push_back() во второй раз, делая то же, что и раньше, но на этот раз он бросает незаконный доступ к памяти при удалении оператора dbgdel.cpp (строка 52). но delete никогда не должен вызываться в конструкторе, или push_back().

Я не уверен, какие разделы кода относятся к этому вопросу, так как рассматриваемые линии довольно укоренены в методе.

Edit: Код добавлен

class Thing{ 
    int** Array; 
    int size; // of square array 
    Point current; // location 
    Thing(int _n){ 
     // allocates, and gives values to the array, and members 
     // only constructor 
    } 
}; 
class ThingMgr{ 
    Thing * Control; 
    Thing * Current; 
    Thing * Previous; 
    int size; // size of all. same use as in Thing 
    ThingMgr(int _n){ 
     size = _n; 
     Control = new Thing(size); 
     Current = new Thing(size); 
     Previous = new Thing(size); 
    } 
    void rearrange(int _num){ 
     std::vector<Thing> possibles; 

     // performs deterministic work on members 

     // [0] first 
     possibles.push_back(Thing(size)); // this succeeds 
     // [1] second 
     possibles.push_back(Thing(size)); // this fails 

     // more operations to be performed never reached. 
    } 
}; 
+0

Можете ли вы разместить строки, включая push_back().Я подозреваю, что вы копируете объект в вектор, и поэтому объект создается, копируется и затем разрушается (так вызывается деструктор) –

+0

Почему бы вам не показать фактический код? Я не уверен, что ваше описание прозы точно соответствует вашему коду, поскольку жаргон кажется немного .. unixed – sehe

+0

Во время 'push_back' векторному классу разрешено делать копии вашего объекта с помощью его конструктора копирования, а затем некоторые из этих копий могут быть уничтожены, и их деструкторы будут вызваны. У вас есть допустимый конструктор копирования для вашего класса? –

ответ

3

первый: я называю push_back() и использовать конструктор объектов в качестве аргумента, но по какой-то причине он идет в деструкторе объекта. почему это; он должен добавить не удаление?

Вы толкаете копию этого элемента в vector. Вы создаете временный элемент, его экземпляр-экземпляр вызывается для создания копии в пределах vector, затем вызывается деструктор временного элемента.

второй: я вызываю push_back() второй раз, делая то же самое, что и раньше, но на этот раз он бросает незаконный доступ к памяти при удалении оператора dbgdel.cpp (строка 52). но delete никогда не должен вызываться в конструкторе или push_back().

Странно, что это происходит при втором вызове, но в конце концов, когда необходимо восстановить его, он снова копирует элементы.

Возможно, вам не удалось создать правильный экземпляр-копию для рассматриваемого элемента.

+0

приятно упомянуть 'emplace_back', чтобы избежать копий – sehe

+0

@sehe: Но я не упоминал об этом, так как OP не использует ** C++ 11 **. Не стесняйтесь редактировать мой вопрос, чтобы добавить его. –

1

Вы храните указатели в своем векторе или копируете в него? Например, это:

class MyClass; 
vector<MyClass> my_vector; 
//or 
vector<MyClass*> my_vector; 

Если это первый тогда, когда вы звоните push_back() вы создаете локальную копию нового объекта, вектор делает копию для хранения в векторе, а затем ваш временный оставляет область действия и разрушается.

Что касается второго раза, я предполагаю, что ваш класс не написан для правильной обработки копий, поэтому деструктор из вашего временного экземпляра удаляет что-то, но копия по-прежнему ссылается на один и тот же указатель. Затем, когда он по какой-то причине удаляется (или ваш новый ссылается на одно и то же по какой-то причине), он ломается. Трудно сказать, не видя кода для своих классов.

+0

добавлен код на вопрос – gardian06

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