Вектор все еще существует? - PullRequest
0 голосов
/ 15 марта 2012

У меня проблема с моей игрой на с ++, связанная с вектором. Я хочу знать, есть ли код, который говорит мне, существует ли вектор. Пример (x = структура, которую я создал):

vector<x*> var;
var.push_back(new x);
var[5]->Pos_X = 10;

А теперь, что я хочу:

delete var[5];

if(var[5] still exists){
     var[5]->Pos_X = 20;
}

Какой может быть код для var [5], до сих пор существует ?

Ответы [ 4 ]

4 голосов
/ 15 марта 2012

Если вы фактически не установили указатель в null после удаления, нет реального способа определить, содержит ли этот слот в векторе указатель на живой объект или нет.

Так что вам нужнона: delete vec[5]; vec[5] = NULL;

Затем вы можете проверить

if (vec[5] == NULL)

, чтобы определить, действительно ли в этом месте что-то было или нет.

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

Для этого нет кода, не без особой тщательной работы в процессе удаления.Если вы храните умные указатели, вы можете сделать это так:

vector<unique_ptr<x>> var;
// assuming you actually do add 6 or more elements to the vector
...
var[5].reset();

if (var[5]) { ... }
1 голос
/ 15 марта 2012

Вы можете использовать var.size(), чтобы увидеть, содержит ли вектор указатель на var[5], но это не скажет вам, действителен ли указатель.

Вы можете создать небольшой класс-оболочку:

template <class T>
class wrapper {
    bool valid;
    T *data_;
public:
    wrapper(T *d): data_(d), valid(true) {}
    del() { delete data; valid = false; }
    bool isValid() { return valid; }
    T *data() { return valid ? data : NULL; }
};

std::vector<wrapper<x> > var;

var[5].del();

if (var[5].valid())
   var[5].data()->Pos_X = 20;

Лично я предпочел бы просто убедиться, что все указатели действительны все время.

0 голосов
/ 15 марта 2012

вызывая delete, вы освобождаете память, указанную этим x *, поэтому у вас все еще есть указатель на некоторый адрес памяти, который больше не содержит того, что вы ожидали.

Если вы хотите удалить элементы из вектора, подумайте об использовании «стирания»; затем, если вы не хотите стереть, а просто «отменить» N-й элемент, структура - ваша ... установите внутри вашей структуры какой-либо флаг bool.

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