[英]Can I prevent object from being copied by std::memcpy?
使用私有拷贝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
}
但是,这并不能防止obiect被深度复制为一个字节包:
int main() {
MyClass a(1), b(2);
std::memcpy(&a, &b, sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
即使试图通过声明operator&
私有来阻止它,仍然可以使用address-of idiom的实现进行复制:
int main() {
MyClass a(1), b(2);
std::memcpy(std::addressof(a), std::addressof(b), sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
有没有任何方法可以完全防止每个字节复制一个实例?
我可以阻止
std::memcpy
复制对象吗?
简单回答是不”。
这不是防弹,但你可以实现自己的memcpy_safe
,其行为类似但接受除void*
其他内容。 然后创建一个包含的包含文件
#define memcpy memcpy_old
#include <cstring>
#undef memcpy
#define memcpy memcpy_safe
并告诉人们使用这个包含文件。 它的作用是隐藏memcpy
的声明,并用memcpy_safe
调用替换对memcpy
所有调用。 新功能需要在自己的翻译单元中实现,因此您可以调用旧的memcpy
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.