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
如果我有一个 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