это безопасно?(qt QQueue.dequeue () разыменование встроенного указателя c ++) - PullRequest
1 голос
/ 30 ноября 2011
Object object = *(queue.dequeue());

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

1 Ответ

3 голосов
/ 30 ноября 2011

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

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

Правильный пример (без динамических объектов, без утечек):

QQueue<Foo*> q;

{
  Foo a;
  q.enqueue(&a);
  Foo b = *q.dequeue();
}

Нерабочий пример (утечка динамического объекта):

QQueue<Foo*> q;
q.enqueue(new Foo);   // eeew, naked "new" in C++...
Foo c = *q.dequeue();
// now the newed element is leaked

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

...