и тот же указатель?
А что это у тебя за порно в коде? blob = (float *) operator new [] ( imageSize.cols * imageSize.rows * imageSize.channels() * sizeof(float) ); Это кто вам так учил?
Сырой кусок памяти который считает нейронка после препроцессинга
Можно просто new, просто я хотел обратить внимание с помощью operator new что это тупо кусок памяти
Зачем operator new явно вызывать?
Просто что бы выделить память
Это бэд практис? Я могу не знать
new float[imageSize.cols * imageSize.rows * imageSize.channels()]?
Изначально было так
А почему перестало быть так?)
Что бы бросилось в глаза
Что бы просто выделить, надо array или vector, и всё
Что ж, цель достигнута: бросилось)
Нейронка принимает float *
Да ты шо! Ужас какой...
а какие плюсы использовать std::vector вместо простого выделения памяти и удаления в деструкторе? кусок этот всегда фиксированный
> и удаления в деструкторе например. Повышаете RAII-гранулярность, что благоприятно. В частности, не требуется следить за исключениями в конструкторе Вашего типа. Если говорить о стандартобиблиотечном контейнере - он еще и набор инструментов по работе над содержимым предоставляет.
а почему не требуется?
Сконструированные (под)объекты гарантированно разрушаются. Будь, скажем, вектор самостоятельным полем, освобождение захваченного ресурса (выделенной памяти) было бы делегировано ему и произошло бы автоматически, даже при броске из Вашего конструктора. Edit: В случае же с "сырым" new за освобождение отвечает Ваш конструктор.
Конструктор. Речь о бросках из него. Edit: Условный T ( ): raw_ptr{new float} { throw 42; } против T ( ): u_ptr{new float} { throw 42; }
имеете ввиду явный вызов деструктора из конструктора при выбросе исключения?
Так в подавляющем большинстве случаев нельзя: разрушите объект дважды. Смотрите пример выше: в первом случае инициализируется float* raw_ptr, во втором - std::unique_ptr<float> u_ptr. В первом случае память потечет, во втором - нет.
Помимо этого, в vector уже реализован Аллокатор, что оптимизирует работу с динамической памятью.
с этим я не спорил, да и вообще не спорил, что надо предпочитать умные указатели сырым
просто в случае исключения в конструкторе о всех сырых ресурсах надо позаботиться самостоятельно: struct holder { char* ptr; holder() try : ptr(new char) { throw 42; } catch(...) { delete ptr; } holder(const holder&) = delete; holder& operator=(const holder&) = delete; ~holder() { delete ptr; } }; int main() { try { holder h; } catch(...) { } } а вот если этот код переписать на std::vector, этого ужаса в конструкторе можно избежать
спасибо, тут отличия ясны
Потому что RAII работает
Что за ужас ты написал ?
Обсуждают сегодня