交换两个类实例的最安全方法
the most safe way to swap two class instance
使用 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));
}
这是一种安全的方式吗???
更新 std::swap
使用 C++0x 可能是安全的。这是比较:c99 与 c++0x
裁判什么是复制和交换成语 感谢Donal Fellows的提醒
问题出在动态分配的指针buffer
,为什么不使用std::string
复制构造函数签名为:
Buffer(const Buffer &e)
现在你交换对象:
int main(int agrc, char* argv[])
{
Buffer a("This is a"), b("This is b");
std::swap(a,b);
}
std::交换代码应比您的交换代码快
template<class _Ty> inline
void swap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
_Ty _Tmp = _Move(_Left);
_Left = _Move(_Right);
_Right = _Move(_Tmp);
}
它将适用于这个特定的 Buffer 对象,但如果它演变而来,如果您将其与另一个类一起使用,则可能根本不安全。它是类的赋值运算符和/或复制构造函数的角色,以使其安全。
相关文章:
- 从C++实例化QML
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 单一实例对象是否通过线程安全返回shared_ptr
- 一种安全、符合标准的方法,使类模板专用化仅在实例化时才无法使用"static_assert"进行编译
- 使用新线程在类似于 Scott Meyer 的单例习惯用法的实现中实例化单例是否安全?
- LLVM:在程序内实现安全的多实例环境
- 交换两个类实例的最安全方法
- 是静态boost::wregex实例线程安全的
- 派生自基类,其实例以固定格式(数据库、MMF)驻留.如何安全
- 使用静态成员实例的 C++ 中的线程安全单一实例(无延迟实例化)
- 将地图实例与临时地图交换是否安全
- 功能与安全/静态与动态实例化