我很困惑何时调用移动构造函数与复制构造函数.我已经阅读了以下资料:
所有这些来源要么过于复杂(我只想要一个简单的例子),要么只展示如何编写移动构造函数,而不是如何调用它.我写了一个简单的问题更具体:
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) 直接赋值(即 =
)与转换内容相同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与'='相同
我认为发生的是A
SetVar返回的rvalue 是一个相同的副本Class
并且共享相同的指针Var
.但是当右值调用其解构它删除Class
的Val
.
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).
删除解构器可以解决问题,但会造成内存泄漏.