это действительная операция удаления в C ++? - PullRequest
2 голосов
/ 19 августа 2011

У меня есть vector<some_struct&> array в моем коде, и всякий раз, когда я хочу добавить какой-либо объект в свой вектор, я использую array.push_back(*new some_struct).Теперь я задаюсь вопросом, должен ли я удалить каждый объект в моем массиве перед очисткой массива (используя delete & array [i]) или нет?

Ответы [ 5 ]

9 голосов
/ 19 августа 2011

vector<some_struct&> array неверно, точка.

Тип (или типы), с которым вы создаете экземпляр контейнера стандартной библиотеки, должны быть объектными типами. Тип ссылки (например, some_struct&) не является типом объекта.

По определению, «контейнеры - это объекты, которые хранят другие объекты» (из §23.1 / 1 в C ++ 03 и C ++ 0x). Ссылки не являются объектами.

Поведение не определено, если вы создаете экземпляр контейнера с типом, который не соответствует требованиям, предъявляемым к контейнеру: ваш код может компилироваться или не компилироваться, и если он компилируется, кто знает, каков будет результат; все может случиться ..

3 голосов
/ 19 августа 2011

Как это вообще компилируется?Это недопустимый код C ++ для любого компилятора, который я использовал за последние 5 лет.

2 голосов
/ 19 августа 2011

Ссылка на вектор говорит, что push_back копирует данные в контейнер.В вашем примере будет скопирован не указатель, а содержимое каждой структуры.Поэтому, если вы используете * new my_struct, ссылка на память, выделенную для структур, будет потеряна после использования их для передачи данных в контейнер, а это означает, что вам нужно сохранить эти указатели для каждой из структур, выделенных вами где-нибудьчтобы освободить их, или вы получите утечки памяти.

Если вы хотите сохранить указатели, контейнер должен быть vector<some_struct*>, и вы можете передать new some_struct и должны (например) освободить их с помощью delete array [i].

0 голосов
/ 19 августа 2011

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

0 голосов
/ 19 августа 2011

Если ваш вектор объявлен vector<some_struct&> array, array.push_back(new some_struct) не должен работать.array.push_back(some_struct()) будет работать, и в этом случае вам не нужно вызывать delete.

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