#c
Вопрос:
у меня есть вопрос.
struct sInfos
{
const char* name;
int8_t id;
int8_t departmant;
};
std::map<int8_t, sInfos*> map_try;
const autoamp; info = new sInfos;
info->name = "asd";
info->id = 0;
info->departmant = 0;
map_try.emplace(id(parametre), info);
//delete info; // HERE
когда я закодировал новый регистр, я использую new sInfos
его, но не удаляю, потому что, когда я пишу delete info
или unique_ptr
или make_unique
у меня возникают проблемы (карта путается (время выполнения)). В этих кодах есть какие-либо утечки? Извините за плохой английский, спасибо всем.
Комментарии:
1. Да, это так.
new
безdelete
-это утечка памяти, простая и понятная. Вот почему разработчики C не любят использоватьnew
. Современный C — это в основномunique_ptr
и другие типы контейнеров. В вашем случае вам действительно даже не нужен указатель, просто сделайтеstd::map<std::string, sInfos>
это . (std::string
потому что комментарий ВозкРайга также является отличным аргументом)2. Я сильно подозреваю, что полученная вами карта здесь не будет тем, что вы намереваетесь.
const char *
ключ без компаратора карт клиентов для заказа не будет заказывать (и этот ключ) карту так, как вы думаете. Порядок в представленном виде будет основываться на глобальном порядке адресов памяти значений указателей, а не на порядке строковых значений. Если бы первое было вашим намерением, так тому и быть, но это было бы так же странно, как и бессмысленно.3. @SilvioMayolo спасибо за комментарий! Примеры кодов верны? (просто пример, так что это дерьмо) godbolt.org/z/WWaefdx93
4. Для удобства чтения, если вы используете необработанные указатели, вам следует писать
auto *info = new sInfos;
вместоconst autoamp; info = new sInfos;
. Если вы действительно хотите быть уверены, что указатель впоследствии не будет обновлен, тоauto* const info = new sInfos;
более четко отобразите намерение.5. @WayneCox Это выглядит хорошо. Я по-прежнему рекомендую читать
std::string
и использовать его вместоconst char*
(первый ведет себя более интуитивно во многих ситуациях). Но ваш связанный код больше не будет пропускать память.