Освобождение массива double-ов в std::unique_ptr

91
23 января 2022, 04:20

Нужен массив double-ов. Количество элементов определяется только во время выполнения программы - поэтому в стеке создать не получится. Необходимо его выделять динамически.

Проблема в том, что если создавать в куче, то придется на выходе из функции его освобождать. Выходов из функций несколько - через время могут появиться еще. Уже звучит не очень.

Появилась идея сделать вот так:

int numbElem = /*run time calc */;
std::unique_ptr<double> massive(new double[numbElem]);

Как будто все норм, но решил спросить - так делать нормально? Будут ли утечки памяти в таком случае?

Answer 1

Что-то мне кажется, что вы хотите

int numbElem = /*run time calc */;
std::unique_ptr<double[]> massive(new double[numbElem]);

А так - все нормально.

"По-моему, так". (с) Пух

P.S. Но, в принципе, то же самое можно достичь и другими, более простыми способами. Но об этом уже сказали в комментариях..

Answer 2

Всем спасибо за помощь) В комментариях посоветовали использовать stl - решил мою проблему метод std::vector::data

UPD: Просили расписать подробнее: Необходимо было использовать библиотечную функцию, которая принимала размер массива и указатель на начало массива -- например void function(int, const double*).

Почему-то у меня в тот момент в голове надежно закрепилась мысль - "Нужен именно массив". В стеке создать этот массив не получится из за того, что его размер не известен на стадии компиляции, а мне не хотелось думать о том, чтобы вручную освобождать на всех выходах динамический массив. В результате появилось сомнительное решение (смотри таск), которое вызывало вопросы - с чем я и пришел сюда. В комментариях справедливо заметили - "почему не std::vector". Этот вопрос решил все проблемы - теперь в качестве первого параметра передается vector::size, а в качестве второго - vector::data, который возвращает указатель на массив, выделенный в куче. Контейнер сам занимается выделением и освобождением этой памяти - мне не пришлось с этим возиться на всех выходах функции.

READ ALSO
Как обрабатывать заголовок Keep-Alive?

Как обрабатывать заголовок Keep-Alive?

Пишу свой http-сервер, для обработки запросов использую классическую схемy: на каждый запрос устанавливается отдельное соединение в отдельном...

170
Ошибка 0xc0000142 при подключении DLL

Ошибка 0xc0000142 при подключении DLL

У меня есть проект на C++ в Visual StudioВ

184
параметры функции main argc argv [дубликат]

параметры функции main argc argv [дубликат]

Для написания каких программ может понадобится параметры функции main argc argv ?

86
считывания чисел из файла с помощью QFile

считывания чисел из файла с помощью QFile

Есть файл вот такого типа

103