Указатели C ++ и освобождение памяти - PullRequest
0 голосов
/ 01 июня 2018

Я менее привык к жесткой проверке типов и вещам более низкого уровня, таким как освобождение.Недавно, при попытке написать что-то вроде

// Product is a struct I defined earlier, nothing fancy
vector<string, Product>::iterator it;
// Do some stuff with the iterator...
// And now I know I won't be using the iterator again
map<string, Product>::iterator it;

Однако это привело к ошибке «дублирующее объявление локальной переменной« it »».Итак, мой вопрос: почему это произошло?Я исследовал деконструкцию памяти, но насколько я знаю, что, очевидно, невозможно деконструировать итераторы, потому что они на самом деле указатели?Неужели C ++ действительно не позволяет вам использовать одно и то же имя для разных переменных, если вы знаете, что вам больше не понадобится старое, или вы обычно выпускаете их в память?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Неважно, на каком языке вы используете, если вы дадите двум разным переменным одно и то же имя в одной и той же области (и они должны быть разными), вы просто [отредактируете], запутаете всех, кто придет после вас (в том числе и в этом случае самостоятельно).И это в два раза больше для людей, которые должны поддерживать ваш код.

Выйти из этой привычки как можно скорее.Неважно, что язык предлагает вам.Только не делай этого.

0 голосов
/ 01 июня 2018

Поскольку it находится в одной и той же области действия , его нельзя повторно объявить: переменная теневое копирование не применяется в той же области действия.

В одну сторонудля этого нужно использовать блоки видимости:

// Product is a struct I defined earlier, nothing fancy
{
    vector<string, Product>::iterator it;
    // Do some stuff with the iterator...
    // And now I know I won't be using the iterator again
}

{
    map<string, Product>::iterator it;
    // However, this yielded the error 'duplicate declaration 
    // Not any more!
}

В C ++ вам на самом деле нужен только один из блоков видимости, но это может быть истолковано как запутывающая асимметрия.Java пытается разобраться в этом, но безуспешно, потому что вы можете удалить вторую пару, но не первую!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...