Мой вектор векторов безопасен для памяти? - PullRequest
1 голос
/ 21 ноября 2011

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

Я определил метод загрузки в классе как:

std::vector<std::vector<double> >* wavloader::load() throw(load_failed)

следовательно, возвращая указатель на этот вектор векторов.

Внутри класса я выделил память для вектора верхнего уровня, затем создал векторы для столько каналов, сколько я хочу, следующим образом:

std::vector<std::vector<double> >* audio_all_chans = new std::vector<std::vector<double> >;

std::vector<double> dummy_vector;

for(int chan_index = 0; chan_index<n_channels; chan_index++)
(*audio_all_chans).push_back(dummy_vector);

Затем я запускаю файл и заполняю каждый из векторов соответствующими выборками.

Хотя верхний уровень «вектор векторов» назначается с помощью new, яобеспокоен тем, что отдельные векторы «канала» (сгенерированные с помощью dummy_vector) расположены в стеке.

Когда я уйду из класса, будут ли содержащиеся векторы выходить за рамки и будут перезаписаны?

Программа компилируется без предупреждения, valgrind полностью ей доволен, и я все еще получаю правильные значения из возвращенного указателя с классом delete d, но я немного обеспокоен, что это может произойтипроисходит что-то коварное!

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Я знаю, это страшно, но то, как ты это сделал, было хорошо.Хорошее практическое правило - посмотреть количество * в вашем объявлении и delete столько же элементов.Таким образом, у вас есть указатель на динамически размещенный вектор.Хорошо, вам нужно удалить это.

А что внутри?Хорошо, что вектор содержал указатели на другие векторы, тогда мы были бы ответственны за избавление от них, но, поскольку у вас есть только векторы, они выйдут за рамки и будут удалены.

1 голос
/ 21 ноября 2011

вектор внутри вектора абсолютно безопасен.Здесь:

(*audio_all_chans).push_back(dummy_vector);

Вы отодвигаете копию вектора, а не сам вектор.

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