Очень жаль, что вы так часто видите динамическое размещение. Это просто показывает, сколько плохих программистов на C ++ существует.
В некотором смысле у вас есть два вопроса, включенных в один. Во-первых, когда следует использовать динамическое распределение (используя new
)? Во-вторых, когда следует использовать указатели?
Важное сообщение о возврате домой - это то, что вы всегда должны использовать соответствующий инструмент для задания. Почти во всех ситуациях есть что-то более подходящее и безопасное, чем выполнение ручного динамического распределения и / или использование необработанных указателей.
В вашем вопросе вы продемонстрировали два способа создания объекта. Основное различие заключается в длительности хранения объекта. При выполнении Object myObject;
внутри блока объект создается с автоматическим временем хранения, что означает, что он будет автоматически уничтожен, когда он выходит за рамки. Когда вы выполняете new Object()
, объект имеет динамическую продолжительность хранения, что означает, что он остается живым, пока вы явно не delete
его. При необходимости вы должны использовать только динамическую память. То есть, вы должны всегда предпочитать создавать объекты с автоматической продолжительностью хранения, когда сможете.
Основные две ситуации, в которых вам может потребоваться динамическое распределение:
Когда вам действительно требуется динамическое размещение, вы должны инкапсулировать его в интеллектуальный указатель или какой-либо другой тип, который выполняет RAII (например, стандартный контейнеры). Умные указатели предоставляют семантику владения динамически распределенных объектов. Посмотрите, например, на std::unique_ptr
и std::shared_ptr
. Если вы используете их надлежащим образом, вы почти полностью можете не выполнять собственное управление памятью (см. Правило нуля ).
Однако есть другие более общие применения для необработанных указателей за пределами динамического распределения, но большинство из них имеют альтернативы, которые вы должны предпочесть. Как и прежде, всегда предпочитайте альтернативы, если вам действительно не нужны указатели.
nullptr
, когда объект опускается. Если это аргумент, вы должны предпочесть использовать аргументы по умолчанию или функции перегрузки. В противном случае вам следует использовать тип, который инкапсулирует это поведение, например std::optional
(введенный на C ++ 17 - с более ранними стандартами на C ++, используйте boost::optional
). get
. Если библиотека выполняет какое-то выделение для вас, которое ожидает от вас освобождения через дескриптор, вы можете часто переносить дескриптор в интеллектуальный указатель с помощью настраиваемого удаления, которое соответствующим образом освободит объект. Вы можете следовать этой документации о том, как загружать фотографии с помощью curl
.
Для создания фотографии требуются три отдельных вызова. Первый вызов возвращает URL-адрес загрузки, который используется во втором вызове для загрузки байтов фотографий. После загрузки фотобайта третий звонок загружает метаданные фотографии и возвращает идентификатор фотографии.
blockquote>
- Запросить URL-адрес загрузки
$ curl --request POST \ --url 'https://streetviewpublish.googleapis.com/v1/photo:startUpload?key=YOUR_API_KEY' \ --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ --header 'Content-Length: 0'
- Загрузите фотобайты в URL-адрес загрузки
$ curl --request POST \ --url 'UPLOAD_URL' \ --upload-file 'PATH_TO_FILE' \ --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'
- Загрузите метаданные фотографии
$ curl --request POST \ --url 'https://streetviewpublish.googleapis.com/v1/photo?key=YOUR_API_KEY' \ --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "uploadReference": { "uploadUrl": "UPLOAD_URL" }, "pose": { "heading": 105.0, "latLngPair": { "latitude": 46.7512623, "longitude": -121.9376983 } }, "captureTime": { "seconds": 1483202694 }, }'
Также есть клиентские библиотеки которые вы можете использовать, чтобы избежать необходимости вручную настраивать HTTP-запросы и анализировать ответы.