C ++ - 在类方法中创建的变量的范围

时间:2015-10-19 21:31:01

标签: c++ class variables methods scope

我正在尝试学习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()时,它运行正常。为什么它不会抛出错误的内存位置无效访问?

2 个答案:

答案 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。所以在将局部变量传递给它时无需担心。