内存分配和释放内存

时间:2014-01-21 21:03:58

标签: c++ c++11

我是一个使用V ++的新手,我一直在想一些记忆行为 我写了类似的类来解决导致我问题的原因。问题是 写在代码的评论中。

class A
{
private:
    int _number;
public:
    A(int number) : _number(number)
    {}

    const int& getNumber() const
    {
        return _number;
    }

    void setNumber(const int& number)
    {
        _number = number;
    }
}

class B
{
private:
    A _a;
    bool _hasA;

public:
    B() : _hasA(false)
    {}

    B(const A & a) : _a(a), _hasA(true)
    {}

    void setA(const A & a)
    {
        _a = a;
    }

    const A& getA() const
    {
        return _a;
    }

    const bool hasA() const
    {
        return _hasA;
    }

    void removeA()
    {
        // ??
    }
}

int main()
{
    A a(5);

    B b1; // Is the A space allocated even if no value is affected to it ?
    B b2(a);

    b1.setA(b2.getA()); // I actually want to move "a" from b2 to b1 without leaving it in b2
    b1.removeA(); // Do I need to write a removeA() function and how would it be?
}

b1.setA(b2.getA());也将A复制到b1而不是移动它。

感谢您的帮助。

编辑:要回答那些像我一样困惑的人:

我:我只是明白,当实例化b1时,它需要A::A()构造函数。如果我在没有实例化b1的情况下创建_a,我认为它会像“null”一样。

Zac Howland:@SanjamX我现在看到你的困惑。在托管语言中,(大多数)一切都是指针,所以如果你没有实例化它(例如A a而不是A a = new A()),它只是一个空指针。在C / C ++中,如果您将某些内容声明为A a,则会在“堆栈”中实例化它。它是一个自动变量,当它超出范围时将被释放。但是,您仍在实例化它。 This question可以帮助您更好地理解。

1 个答案:

答案 0 :(得分:3)

B b1();

这不符合你的想法。它声明一个函数b1,它不带参数并返回B

b1.setA(b2.getA());
b1.removeA();

由于前面的情况,上面的2行会给你一个编译错误。

你要问的“移动”实际上是一个副本(在这种情况下)。您可以使用C ++ 11移动语义来进行实际移动,但使用当前代码完全没有必要。或者,您可以更改类以使用指针(可能有用)进行移动 - 这将使用std::unique_ptr<A> _a,而不是A _a