使用私有拷贝construcor和赋值运算符boost::noncopyable
或C ++ 11 delete
关键字很容易创建不可复制的类:
class MyClass {
private:
int i;
public:
MyClass(const MyClass& src) = delete;
MyClass& operator=(const MyClass& rhs) = delete;
int getI() {
return i;
}
MyClass(int _i) : i(_i){}
};
int main() {
MyClass a(1), b(2);
a = b; // COMPILATION ERROR
}
然而,这并不能防止对象被深度复制为一包字节:
int main() {
MyClass a(1), b(2);
std::memcpy(&a, &b, sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
即使尝试通过声明operator&
私有来阻止它,它仍然可以使用地址惯用语的实现进行复制:
int main() {
MyClass a(1), b(2);
std::memcpy(std::addressof(a), std::addressof(b), sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
是否有任何方法可以完全阻止每个字节复制一个实例?
答案 0 :(得分:10)
我可以阻止
std::memcpy
复制对象吗?
简单的答案是&#34;否&#34;。
答案 1 :(得分:0)
这不是防弹,但您可以实现自己的memcpy_safe
行为相似但接受void*
之外的其他内容。然后创建一个包含
#define memcpy memcpy_old
#include <cstring>
#undef memcpy
#define memcpy memcpy_safe
告诉人们使用这个包含文件。它的作用是隐藏memcpy
的声明,并通过调用memcpy
替换对memcpy_safe
的所有来电。新功能需要在自己的翻译单元中实现,因此您可以调用旧的memcpy
。