我正在尝试学习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 :(得分:8)
你说:
根据我的理解,如果变量超出范围,那么它将被销毁并重新分配其内存。
这是正确的。 &#34;重新分配&#34;我会用的是不正确的词。我会将其表达为:对象使用的内存可供其他对象使用。
然后你问:
如果我有一个类并且它的方法创建了一个变量,那么在方法调用之后不应该销毁该变量吗?
这是正确的。
但是,你的情况有所不同。
使用时:
pairs.push_back(x);
x
的副本放在pairs
中。函数返回后,副本将继续存在pairs
。因此,printPairs()
和removePair()
工作正常。
答案 1 :(得分:5)
首先,访问范围之外的变量是未定义的行为。程序可能会抛出错误,但可能甚至可以正常运行。因此,无法保证会出现错误。
其次,std::vector::push_back
makes a copy of its arguments。所以在将局部变量传递给它时无需担心。