使用swap
交換兩個類實例,有時可能會引發錯誤。交換兩個類實例的最安全方法
#include <iostream>
#include <string>
using namespace std;
#include <cstring>
class Buffer {
public:
Buffer(const string& s): buffer(s) {}
string buffer;
};
template<class _Tx>
void SWAP(_Tx& a, _Tx& b) {
size_t size = sizeof(_Tx);
char buffer[size];
memcpy(buffer, &a, size);
memcpy(&a, &b, size);
memcpy(&b, buffer, size);
}
int main() {
Buffer a("This is a"), b("This is b");
swap(a,b);
cout << a.buffer << endl;
SWAP(a,b);
cout << b.buffer << endl;
return 0;
}
的std::swap
會做這樣的事情:
template<class _Tx>
void swap(_Tx &a, _Tx &b) {
_Tx t = a;
a = b;
b = t;
}
_Tx t = a;
將調用_Tx
拷貝構造函數,這是在這種情況下Buffer::Buffer(Buffer &e)
。此方法嘗試分配一些內存,這可能會導致一些錯誤。
我嘗試用另一種方法,而不是std::swap
:
template<class _Tx>
void SWAP(_Tx& a, _Tx& b) {
char buffer[sizeof(_Tx)];
memcpy(buffer, &a, sizeof(_Tx));
memcpy(&a, &b, sizeof(_Tx));
memcpy(&b, buffer, sizeof(_Tx));
}
它是一種安全的方式???
UPDATES std::swap
可能是安全的與C++ 0x。這是比較:c99與c++0x
REF what-is-the-copy-and-swap-idiom謝謝多納爾研究員的提醒
re'memcpy'不,絕對沒有。 –
當然,在非平凡類型中使用'memcpy'比goold old'std :: swap'安全得多(我希望你不介意這種諷刺);)。 –
可能重複[什麼是複製和交換成語?](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom) –