ПОМОГИТЕ! этот код вызовет ошибку памяти после того, как объект C ++ выйдет из области видимости? (Проблема STL) - PullRequest
3 голосов
/ 10 августа 2010

Я только что наткнулся на фрагмент кода, написанный моим бывшим коллегой несколько лет назад. Честно говоря, я не эксперт C ++, поэтому я ищу помощь.

Код выглядит так:

std::vector<OBJ> objects;

void initobjs()
{
    for (int i=0; i<10; i++)
    {
        OBJ obj;
        obj.type=i;
        obj.len=16;

        objects.push_back(obj);
    }
}

Мой вопрос: после возврата функции initobjs() не все ли экземпляры obj уже находятся вне области действия и автоматически освобождаются системой времени выполнения C ++? Если это так, будет ли какая-либо ссылка на содержимое какого-либо из объектов, добавленных в вектор, вызывать ошибку памяти или неожиданный результат?

Ответы [ 3 ]

13 голосов
/ 10 августа 2010

Ваше беспокойство можно сделать еще более локальным: obj заканчивается в конце цикла for.

Тем не менее, контейнер делает копию своего аргумента *,и не хранит никаких ссылок или указателей на «оригинальное» значение.

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

7 голосов
/ 10 августа 2010

Исходные объекты будут находиться вне области видимости, но метод push_back() фактически создает их копии, потому что они передаются по значению. Поэтому при выходе из функции initobjs() копии все еще находятся в векторе; они будут освобождены, когда вы удалите их из вектора или когда сам вектор выйдет из области видимости.

Если бы вектор был vector<OBJ*>, то это было бы совсем другое дело: это означало бы, что вам придется вручную удалять каждый объект в тот момент, когда вы удаляете его из вектора (если вы не сохраните его в другом месте).

Обратите внимание, что C ++ вообще не имеет встроенной системы управления памятью, кроме переменных, выделенных стеком, которые освобождаются по окончании их области действия. RAII - это модное слово, которое вы ищете на тот случай, если хотите немного больше осознать себя.

1 голос
/ 10 августа 2010

Вектор objects будет содержать «копии» OBJ в цикле for. В зависимости от того, что делает конструктор копирования OBJ, это может привести к соответствующим результатам или нет.

Я бы пошел и проверил конструктор копирования OBJ на наличие подозрительных вещей.

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