[英]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.