簡體   English   中英

我可以阻止std :: memcpy復制對象嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM