C++ 交换成员数组和关联指针

C++ Swapping Member Arrays and Associated Pointers

如果我有一个 class 包含一个成员数组,两端都有指针,例如,

int mArray[5];
int *mStart = mArray;
int *mEnd = mArray + 5;

然后我交换 class,比如在我的标准赋值运算符中使用 std::swap(mArray, other.mArray),过程中的指针会发生什么变化?

这是一个非常人为的例子,但在我的程序中,如果我只交换数组,赋值运算符会按预期工作,如果我尝试交换所有三个成员变量,它就会崩溃。有什么想法吗?

即使您更改存储在 mArray 中的值,数组仍位于同一地址。所以指针仍然是正确的。

如果将指针值与另一个对象交换,则一个对象中的指针将指向另一个对象的数组。效果不会很好!

您可以像标准容器那样存储一个指针,让一个 begin 成员向数据返回一个 pointer/iterator。

int* begin()
{ return mArray; }

end().

也是如此

(假设这些实际上不是 static 成员,但你的意思是它们不是动态分配的。)

交换数组时,数组不会移动;仅交换它们的内容。
(数组不是指针。)

交换指针不起作用的原因是指针随后指向其 "original" 对象的数组成员。
如果您不交换它们,它们将一直指向创建它们的数组。

示例:

起点:

Object A: mArray starts at 0x1000; mStart is 0x1000; mEnd is 0x1014
Object B: mArray starts at 0x2000; mStart is 0x2000; mEnd is 0x2014

swap 之后没有指针交换:

Object A: mArray starts at 0x1000; mStart is 0x1000; mEnd is 0x1014
Object B: mArray starts at 0x2000; mStart is 0x2000; mEnd is 0x2014

swap 后指针交换:

Object A: mArray starts at 0x1000; mStart is 0x2000; mEnd is 0x2014
Object B: mArray starts at 0x2000; mStart is 0x1000; mEnd is 0x1014