Для кода, который вы разместили, трудно сказать, нормально ли удалять массивы, потому что некоторые части отсутствуют.
В целом, однако, MPI_Scatter
и MPI_Bcast
блокируют вызовы.Это означает, что код будет продолжаться, только если эти вызовы функций были успешно завершены.(Это не значит, что все процессы завершены.) MPI
может все же завершить некоторые вещи под капотом, но, что касается вашего кода, это сделано.Поэтому безопасно удалить данные, которые вы поместили в эти функции, потому что MPI
больше не обращается к ним после вызова.
Sidenote:
На это уже указывалосьв комментариях, но я еще раз подчеркиваю: гораздо проще использовать умные указатели для управления памятью, чем использовать raw new
и delete
.Вы даже можете хранить массивы в стиле C!Например:
#include <memory>
...
std::unique_ptr<double[]> b = std::make_unique<double[]>(n/size);
//at the callsites use b.get() instead of b
Этот подход позволяет компилятору автоматически удалять точку (с ее содержимым), если она больше не используется.Кроме того, вы не можете забыть позвонить delete
плюс исключения обрабатываются правильно.
В качестве альтернативы вы можете просто использовать std::vector
и передать указатель .data()
на MPI
.
Добавление:
Если вы планируете некоторое время использовать MPI
и не любите бороться с интерфейсом C, вам следует рассмотреть возможность использования библиотеки оболочки C ++, такой как Boost.MPI .