繁体   English   中英

内存分配和释放内存

[英]Memory allocation and releasing memory

我是使用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()构造函数。 我认为如果不实例化_a而创建b1它将像“ null”之类。

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

B b1();

那并没有您所想的那样。 它声明一个不带参数且返回B的函数b1

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

由于前面的情况,以上两行将为您提供编译器错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM