Да, вы делаете правильно.
Однако учтите, что ручное управление памятью подвержено ошибкам, будь то утечки памяти или двойное удаление. намного лучше забыть о голых new
и особенно delete
, и вместо этого использовать классы RAII для безопасной обработки.
В вашем случае вы должны заменить указатели на динамическивыделенные массивы с std::vector
.std::vector
- это способ для написания «динамически распределенного массива» в C ++.Как только вы это сделаете, вы будете знать, что вектор позаботится о правильном освобождении памяти, даже при наличии исключений.
Вот как ваш код может выглядеть с std::vector
:
void a(){
auto one=b();
auto two=c();
auto three=d();
//operate with 3 array (one, two and three)
//nothing to do here, the vectors will deallocate memory correctly when they go out of scope
}
std::vector<MyClass> b(){
std::vector<MyClass> array(2000);
//many operations on array
return array;
}
std::vector<MyClass> c(){
std::vector<MyClass> array(2000);
//many operations on array
return array;
}
std::vector<MyClass> d(){
std::vector<MyClass> array(2000);
//many operations on array
return array;
}
Что касается того, почему вы не видите эффектов освобождения: память, освобожденная delete
, не должна быть немедленно возвращена операционной системе.Довольно часто среда выполнения C ++ сохраняет ее и использует для удовлетворения будущих требований к размещению вашей программы.