使用私有(private)复制构造和赋值运算符,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&
私有(private)来阻止它,仍然可以使用地址成语的实现来进行复制:
int main() {
MyClass a(1), b(2);
std::memcpy(std::addressof(a), std::addressof(b), sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
有没有什么方法可以完全防止实例被逐字节复制?
最佳答案
Can I prevent object from being copied by
std::memcpy
?
简单的答案是“不”。
关于c++ - 我可以防止对象被 std::memcpy 复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29759105/