2015-10-19 79 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,如果你的权利(关于行为)。这不是他的问题。他问为什么Pairs通过他的职能跳槽后仍然存在。他们都是彼此相对的。这是一种课堂行为。 –

+0

@DavidPulse“你没有为他过去定义任何参考点。”具有讽刺意味的是,这是一个超过你的答案的环节。 “如果你的权利是50/50”详细说明。 “他们都是彼此相对的。”你在谈论C++吗? – Downvoter

+0

链接是当你干的时候。 *“程序会抛出一个错误,但它甚至可能工作正常,所以不能保证会出现错误。”*类变量和方法是相对的。你喜欢拖钓吗?从来没有进入它。我猜想我太想念了。 –

8

你说:

从我的理解

如果变量超出范围则销毁,它的内存被重新分配。

这是正确的。 “重新分配”是我使用的不正确的词。我会将其描述为:对象使用的内存可供其他对象使用。

然后你问:

如果我有一个类,它的方法创建一个变量,应该不是变量的方法调用后销毁?

这是正确的。

但是,您的情况是不同的。

当你使用:

pairs.push_back(x); 

x副本放在pairs。函数返回后,拷贝继续在pairs中生存。因此,printPairs()removePair()工作得很好。

+0

我upvote这个,但我认为澄清'x'是一个类变量实例帮助。然后通过成对挤出成型。它的C++肤色很好。 –

+0

@DavidPulse,我猜测英语不是你的第一语言。我并不完全听从你想说的话。 –

相关问题