векторные проблемы с ++ - PullRequest
0 голосов
/ 08 марта 2012

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

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

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

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

Редактировать: Код добавлен

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.
    }
};

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

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

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

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

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

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

1 голос
/ 08 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...