2011-11-20 1 views
1

Я разрабатываю класс для чтения 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, но я немного обеспокоен тем, что может произойти что-то коварное !

+0

Если 'valgrind' говорит, что вся память кучи была правильно освобождена, и ваша программа скомпрометирована, почему вы думаете, что что-то будет« случайно перезаписано »? –

+0

Почему вы создаете динамически выделенный вектор? Рассматривали ли вы его обертывание в интеллектуальном указателе? –

+2

Почему вы динамически выделяете вектор и затем возвращаете указатель на него? Почему бы просто не вернуть вектор по значению? – fredoverflow

ответ

1

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

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

+3

Это может быть «безопасно для памяти», но это не исключение. –

1

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

(*audio_all_chans).push_back(dummy_vector); 

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

Смежные вопросы