小编Lau*_*uer的帖子

何时调用Move Constructor?

我很困惑何时调用移动构造函数与复制构造函数.我已经阅读了以下资料:

移动构造函数未在C++ 0x中调用

在C++ 11中移动语义和右值引用

MSDN

所有这些来源要么过于复杂(我只想要一个简单的例子),要么只展示如何编写移动构造函数,而不是如何调用它.我写了一个简单的问题更具体:

const class noConstruct{}NoConstruct;
class a
{
private:
    int *Array;
public:
    a();
    a(noConstruct);
    a(const a&);
    a& operator=(const a&);
    a(a&&);
    a& operator=(a&&);
    ~a();
};

a::a()
{
    Array=new int[5]{1,2,3,4,5};
}
a::a(noConstruct Parameter)
{
    Array=nullptr;
}
a::a(const a& Old): Array(Old.Array)
{

}
a& a::operator=(const a&Old)
{
    delete[] Array;
    Array=new int[5];
    for (int i=0;i!=5;i++)
    {
        Array[i]=Old.Array[i];
    }
    return *this;
}
a::a(a&&Old)
{
    Array=Old.Array;
    Old.Array=nullptr;
}
a& a::operator=(a&&Old)
{
    Array=Old.Array;
    Old.Array=nullptr;
    return *this;
}
a::~a()
{
    delete[] Array;
} …
Run Code Online (Sandbox Code Playgroud)

c++ move-constructor c++11

23
推荐指数
2
解决办法
2万
查看次数

For循环vs赋值运算符

直接赋值( =)与转换内容相同char*,然后使用for循环来逐字节复制它吗?*
我想知道一种方法是否优于另一种方法.

struct A
{
    int a;
    int b;
} Test;

void* Buffer = malloc(1024);


// Casting and byte copying
for (int i=0; i != 8; i++)
{
    ((char*)Buffer)[i] = ((char*)Test)[i];
}

// Assignment
((A*)Buffer)[0] = Test;
Run Code Online (Sandbox Code Playgroud)

*所有类型都是按位可复制的.

编辑:根据答案,memcopy与'='相同

c++ bit-manipulation copy

0
推荐指数
1
解决办法
330
查看次数

返回*这个; 删除指针

我认为发生的是ASetVar返回的rvalue 是一个相同的副本Class并且共享相同的指针Var.但是当右值调用其解构它删除ClassVal.

class A
{
private:
    int* Var;
public:
    A SetVar(int);
    ~A()
    {
        delete Var;
    }
};

A A::SetVar(int NewVar)
{
    Var=new int;
    *Var=NewVar;
                //POINT A
    return *this;
}

int main()
{
    A Class;
    Class.SetVar(8);

                //POINT B
}
Run Code Online (Sandbox Code Playgroud)

POINT A *Val等于8,但POINT B *Val平等-17891602.由于尝试删除Val两次,我也得到_BLOCK_TYPE_IS_VALID(pHead-> nHeadUse).

删除解构器可以解决问题,但会造成内存泄漏.

c++ class rvalue

0
推荐指数
1
解决办法
163
查看次数

标签 统计

c++ ×3

bit-manipulation ×1

c++11 ×1

class ×1

copy ×1

move-constructor ×1

rvalue ×1