memcpy 写入“class uint256”类型的对象

问题描述

嗯,这可能是一个非常简单的警告来修复,但我还没有弄清楚。前段时间,我对 uint256 类进行了更新,之后,我收到此警告:

base58.h:261:52: warning: ‘void* memcpy(void*,const void*,size_t)’ writing to an object of type ‘class uint256’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
         memcpy(&id,&vchData[0],HASH_LEN_BYTES);

这是memcpy所在的函数

bool GetKeyID(CKeyID &keyID) const {
    if (!IsValid())
        return false;
    switch (nVersion) {
    case PUBKEY_ADDRESS:
    case PUBKEY_ADDRESS_TEST: {
        uint256 id;
        memcpy(&id,HASH_LEN_BYTES);
        keyID = CKeyID(id);
        return true;
    }
    default: return false;
    }
}

这是我的 uint256 类:uint256.h

解决方法

有两种替代解决方案:

  • 使类变得可简单复制。
  • 不要尝试 memcpy 类。

如何在这种情况下替换 memcpy?

编写一个构造函数,接受任何 vchData 作为参数。

我怎样才能让这个类变得简单可复制?

删除复制构造函数和任何不可复制的成员/基类。

,

您已经为 base_uint<N>here

定义了一个副本分配

还有一个 base_uint here 的复制构造函数,以及一个转换构造函数 uint256 here

此外,如果您只是将 (uint256*) 参数强制转换为 (void*),警告将消失,您将获得预期的行为,但这不是推荐的方法,因为它可能会在未来,如果你真的在任务中做出了一些不同的事情。我认为最好的是删除那些复制构造函数和赋值运算符。在我看来,唯一有趣的运算符是不同宽度的 base_uint 之间的转换。