如果我在c ++中的方法中创建对象,它们会在函数返回时自动销毁,还是会继续占用内存?

时间:2015-05-11 14:40:51

标签: c++

void Player::draw(sf::RenderTarget& target, sf::RenderStates states) const
{

    sf::CircleShape c0;
    c0.setFillColor(sf::Color::Red);
    c0.setPointCount(4);
    c0.setRadius(1);
    c0.setPosition(sf::Vector2f(point[0].x, point[0].y));

    sf::CircleShape c1;
    c1.setFillColor(sf::Color::Red);
    c1.setPointCount(4);
    c1.setRadius(1);
    c1.setPosition(sf::Vector2f(point[1].x, point[1].y));

    target.draw(c0);
    target.draw(c1);
}

我正在学习c ++。正如您所看到的,我在draw方法中创建CircleShape对象,该方法在一秒钟内运行60次。我在网上读到c ++中的对象存储在堆内存中,因此需要手动释放。对象c0和c1是否被破坏,当draw方法返回时内存是否释放,还是会继续占用堆内存?

2 个答案:

答案 0 :(得分:1)

您编写的代码仅在堆栈上创建临时对象,当方法退出时会被销毁。

通常,当您的变量超出范围时,其内容将不再可用。

如果使用“new”关键字分配内存,那么您的对象将保留在内存中,但当引用它们的变量超出范围时,指针会丢失。

修改

实际上,“临时对象”是C ++语言的一个特性,如果使用不当会导致头痛。在此处阅读更多内容:Temporary objects - when are they created, how do you recognise them in code?

您在函数内创建为局部变量的对象会自动分配和销毁,我只使用“临时”一词来描述它们的行为:当函数退出时它们会被丢弃。

答案 1 :(得分:0)

  

当draw方法返回时,对象c0和c1是否被破坏并释放内存,

是。它们在函数返回时被销毁。

  

还是他们会继续吃堆内存?

答案取决于你在构造函数和类的析构函数中做了什么。如果在构造函数或任何其他成员函数中从堆分配内存,则应在析构函数中释放该内存。否则,你的函数会间接泄漏内存。