首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存分配和释放内存

内存分配和释放内存
EN

Stack Overflow用户
提问于 2014-01-21 21:03:57
回答 1查看 99关注 0票数 0

我是一个使用V++的新手,我一直在想一些记忆行为。

我写了类似的类给我带来了问题。这些问题写在代码的注释中。

代码语言:javascript
复制
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中,而不是移动它。

谢谢你的帮助。

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

Me :我只知道当实例化b1时,它需要A::A()构造函数。如果我创建b1而不实例化_a,我想这就像"null“或者什么的。

扎克·豪兰德:“桑贾姆,我现在看到你的困惑了。在托管语言中,(大多数)所有东西都是一个指针,所以如果不实例化它(例如A而不是A a = new A()),它只是一个空指针。在C/C++中,如果将某物声明为A a,则实例化它为“在堆栈上”。它是一个自动变量,当它超出作用域时将被释放。但是,您仍然在实例化它。This question可以帮助您更好地理解。

EN

回答 1

Stack Overflow用户

发布于 2014-01-21 21:09:21

代码语言:javascript
复制
B b1();

那不像你想的那样。它声明一个不接受参数并返回一个b1的函数B

代码语言:javascript
复制
b1.setA(b2.getA());
b1.removeA();

由于前面的情况,上面的2行将给您一个编译器错误。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21269063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档