2015-10-19 3 views
4

Я пытаюсь изучить C++, и из моего понимания, если переменная выходит из области видимости, она уничтожается и ее память перераспределяется. Если у меня есть класс и его метод создает переменную, не следует ли эту переменную уничтожать после вызова метода? Например:C++ - Область переменных, созданных в методе класса

class TestClass { 
public: 
struct Pair{ 
    std::string name; 
    int value; 
}; 
void addPair() { 
    //should be deleted after push_back is called? 
    Pair x = Pair{ std::string{ "Test Object " }, counter++ }; 
    pairs.push_back(x); 
} 
void printPairs() { 
    for (int i = 0; i < pairs.size(); i++) { 
     std::cout << "pair { " << pairs[i].name << " : " << pairs[i].value << " } " << std::endl; 
    } 
} 
void removePair() { 
    pairs.pop_back(); 
} 
private: 
    int counter; 
    std::vector<Pair> pairs; 
}; 

Но когда я попытался addPair() затем printPairs() затем removePair() он работает отлично. Почему он не выдает ошибку, говоря о некорректном доступе к ячейке памяти?

+0

Ваш код не содержит доступа к недопустимым переменным. Можете ли вы изменить свой вопрос, чтобы точно объяснить, где вы думаете, проблема? Это поможет опубликовать ваш фактический код, а не описывать его. –

ответ

5

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

Во-вторых, std::vector::push_backmakes a copy of its arguments. Поэтому ничего не стоит беспокоиться о том, когда передают ему локальные переменные.

+0

Ваш ответ полностью риторический. Вы не определяете точку отсчета для него. Вы почти указываете на себя, но, очевидно, пропустите, что это 50/50, если вы правы (о поведении). И это был не его вопрос. Он спросил, почему Пары все еще существовали после того, как они прыгали через его функции. Они все относительно друг друга. Это классное поведение. –

+0

@DavidPulse «Вы не определяете для него никакой точки отсчета». По иронии судьбы, это одна ссылка больше, чем ваш ответ. «это 50/50, если вы правы». Разработайте это. «Они все относительно друг друга». Вы говорите о C++? – Downvoter

+0

Ссылки для вас, когда вы сушите. * «Программа migh выдает ошибку, но она может даже работать хорошо. Поэтому нет никакой гарантии, что будет вызвана ошибка». * Переменные класса и методы относительны. Тебе нравится много троллировать? Никогда не попадал в нее. Мисс так много, я думаю. –

8

Вы сказали:

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

Это правильно. «reallocated» - неправильное слово, которое я бы использовал. Я бы назвал это следующим: память, используемая объектом, доступна для использования другими объектами.

А потом спросил:

Если у меня есть класс, и это метод создает переменный, не следует, что переменное будет уничтожен после вызова метода?

Это правильно.

Однако ваша ситуация иная.

При использовании:

pairs.push_back(x); 

копия x помещается в pairs. Копия продолжает жить в pairs после возвращения функции. Следовательно, printPairs() и removePair() работают просто отлично.

+0

Я повышаю это, но я думаю, что разъяснение «x» - это экземпляр переменной класса. Затем он подвергается экструдированию по парам. И он сидит хорошо как C++ цвет лица. –

+0

@DavidPulse, я предполагаю, что английский не является вашим первым языком. Я не совсем понимаю, что вы пытаетесь сказать. –

Смежные вопросы