c++ - 我可以防止对象被 std::memcpy 复制吗?

标签 c++ c++11 memory

使用私有(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/

相关文章:

c++ - 在 C++ 中放置接口(interface)类的位置

c++ - 在 Linux C++ 中获取 PTY 的最简单方法

memory - 检查 pmap 报告的虚拟内存块

c++ - 这种模式有什么优雅的解决方案?多级搜索

c++ - 尽管构建成功,但 Eclipse Neon 构建错误

c++ - 如何将具有特定语言环境的 u32string (char32_t) 大写?

c++ - 185000阵列后BFPRT(中位数中值)算法崩溃

c++ - 32 位 C++ 程序中的最大可寻址内存空间是多少?

c++ - 类中定义的友元函数模板是否可供查找? clang++ 和 g++ 不同意

C++ 重载解析不明确 - GCC