c++ 移动不是指针的变量?

wfveoks0  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(105)

我的问题是,如果我们想移动一个对象,而在该对象内部,我们想移动的变量不是指针,我们应该如何释放临时值?
我应该把临时变量的内存分配给nullptr吗?(这是不可能的)
下面是代码以便更好地理解

class Foo
{
public:
    ...

    Foo(Foo&& other) noexcept
    {
        m_Value = other.m_Value;

        /*
        The bottom line will not work, so what should I do instead of this line of code?
        */
        &other.m_Value = nullptr;
    }
private:
    int m_Value;
};
7y4bm7vi

7y4bm7vi1#

不使用指针

因为m_Value不是指针,所以不需要将其设置为null,因为它只是一个int(i)。在这种情况下,一个变量只能保存整数),这里有一个例子:

#include <iostream>

class Foo
{
public:
    Foo(Foo* other = nullptr)
    {
        if (other != nullptr)
        {
            m_Value = other->m_Value;
    
            // Just remove the line.
            //other->m_Value = nullptr;
        }
        else
        {
            m_Value = 2;
        }
    }
    
    int m_Value;
};

int main()
{
    Foo a;
    Foo b(a);
    
    std::cout << b.m_Value;
    
    return 0;
}

// OUTPUT: 2

使用指针

即使您指定不想使用指针,但在必须传输大块数据时,了解指针始终是一个很好的特性。
例如,如果m_Value是一个包含大量数据的大类,那么传输指向它的变量比传输整个类更好。
下面是一个示例,它使foo类能够将m_Value变量设置为nullptr:

#include <iostream>

class Foo
{
public:
    Foo(Foo* other = nullptr)
    {
        if (other != nullptr)
        {
            m_Value = other->m_Value;
    
            // Set m_Value to nullptr after transporting its value to ours.
            other->m_Value = nullptr;
        }
        else
        {
            m_Value = new int(2);
            
            // It's the same as:
            // m_Value = 2;
            // But for pointers.
        }
    }
    
    ~Foo()
    {
        delete m_Value;
    }
    
    int* m_Value = nullptr;
};

int main()
{
    Foo a;
    Foo b(&a);
    
    // The * operator takes the value '2' from the pointer m_Value.
    std::cout << *b.m_Value;
    
    return 0;
}

// OUTPUT: 2

正如您所看到的,除了代码更长之外,foo类现在充分利用了C的指针。
如前所述,您编写的代码不起作用,因为m_Value不是指针,而只是一个int,它只能保存整数,而不能保存变量地址。
使m_Value成为int* i。例如,一个指针包含一个指向整数的地址,将解决这个问题,你现在可以设置m_Value为nullptr,但你必须遵循指针规则,如分配和删除指针,当你完成使用它们。
如果你想了解更多,可以检查C
指针上的W3 School tutorial

相关问题