C ++ управление памятью для вектора с элементами переменной длины - PullRequest
1 голос
/ 09 августа 2010

Возьмите структуру переменной длины (если бы это была программа real , лучше использовать массив int):

#include <vector>
struct list_of_numbers(){
  int length;
  int *numbers; //length elements.
};
typedef std::vector<list_of_numbers> list_nums; //just a writing shortcut

(...)

И создайте из него вектор:

list_nums lst(10); //make 10 lists.
lst[0].length = 7; //make the first one 7 long.
lst[0].X = new int[7]; //allocate it with new[]

(...)

Вышеописанное работает для g ++ в Ubuntu. Вызовы new () необходимы для избежания ошибок. Можно ли удалить первый вектор, если он больше не нужен, или новые вызовы вызовут утечку памяти? Было бы утомительно удалять () вручную все части, вызываемые с помощью new ().

Ответы [ 3 ]

4 голосов
/ 09 августа 2010

Типичные способы сделать это в C ++ - определить конструкторы и деструкторы и операторы присваивания для структуры list_of_numbers, которые заботятся об управлении памятью, или (намного лучше) использовать std::vector<int> для numbers поле и избавиться от поля length.

Но если вы сделаете это, вы можете полностью избавиться от структуры и просто сделать это:

#include <vector>
typedef std::vector<int> list_ints;
typedef std::vector<int_ints> list_lists;

(...)

list_lists lst(10); // make 10 lists.
lst[0].resize(7);   // set length of the zeroth list to 7
2 голосов
/ 09 августа 2010

Почему бы просто не использовать вектор вектора типа int?Это работа.Вы не должны вызывать новых за пределами выделенного класса.

0 голосов
/ 09 августа 2010

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

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