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

Doe*_*Doe 4 c++ variables methods scope class

我正在尝试学习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;
};
Run Code Online (Sandbox Code Playgroud)

但是,当我试图addPair()printPairs()然后removePair()它工作正常.为什么不抛出错误说无效访问内存位置?

R S*_*ahu 8

你说:

根据我的理解,如果变量超出范围,那么它将被销毁并重新分配其内存.

那是正确的."重新分配"不是我会使用的正确单词.我会将其表达为:对象使用的内存可供其他对象使用.

然后你问:

如果我有一个类并且它的方法创建了一个变量,那么在方法调用之后不应该销毁该变量吗?

那是正确的.

但是,你的情况有所不同.

当你使用:

pairs.push_back(x);
Run Code Online (Sandbox Code Playgroud)

x放入的副本pairs.pairs函数返回后,副本继续存在.因此,printPairs()removePair()工作得很好.


cad*_*luk 5

首先,访问范围之外的变量是未定义的行为.该程序可能会抛出错误,但它甚至可能运行良好.因此无法保证会出现错误.

其次,std::vector::push_back 复制其论点.因此在将局部变量传递给它时无需担心.

  • @DavidPulse给出的答案足以解释OP的问题.仅仅答案的第二段就足够了.为什么争辩回答*正确*? (2认同)