Я разрабатываю класс для чтения 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, но я немного обеспокоен тем, что может произойти что-то коварное !
Если 'valgrind' говорит, что вся память кучи была правильно освобождена, и ваша программа скомпрометирована, почему вы думаете, что что-то будет« случайно перезаписано »? –
Почему вы создаете динамически выделенный вектор? Рассматривали ли вы его обертывание в интеллектуальном указателе? –
Почему вы динамически выделяете вектор и затем возвращаете указатель на него? Почему бы просто не вернуть вектор по значению? – fredoverflow