我可以阻止std :: memcpy复制对象吗?

时间:2015-04-20 21:52:46

标签: c++ c++11 memory

使用私有拷贝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
}

是否有任何方法可以完全阻止每个字节复制一个实例?

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