首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向类型为“uint256类”的对象写入memcpy

向类型为“uint256类”的对象写入memcpy
EN

Stack Overflow用户
提问于 2021-03-12 08:29:30
回答 2查看 1.2K关注 0票数 2

嗯,这可能是一个很简单的警告,但我还没有弄清楚。不久前,我对我的uint256类进行了更新,之后,我收到了这样的警告:

代码语言:javascript
复制
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所在的函数:

代码语言:javascript
复制
bool GetKeyID(CKeyID &keyID) const {
    if (!IsValid())
        return false;
    switch (nVersion) {
    case PUBKEY_ADDRESS:
    case PUBKEY_ADDRESS_TEST: {
        uint256 id;
        memcpy(&id, &vchData[0], HASH_LEN_BYTES);
        keyID = CKeyID(id);
        return true;
    }
    default: return false;
    }
}

这是我的uint256类:uint256.h

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-12 08:47:43

您已经为base_uint<N>这里定义了副本分配。

以及用于base_uint 这里的复制构造函数和转换构造函数uint256 这里

另外,如果您只是简单地将您的(uint256*)参数转换为(void*),则警告将被取消,并且您将具有预期的行为,但这不是推荐的方法,因为如果您在分配中确实做了一些不同的事情,那么它在将来可能会悄无声息地中断。我认为最好的办法是删除那些复制构造函数和赋值操作符。在我看来,唯一感兴趣的运算符是不同宽度的base_uint之间的转换。

票数 2
EN

Stack Overflow用户

发布于 2021-03-12 08:34:56

有两种解决办法:

  • 使这门课在小范围内可复制。
  • 不要试图对这个类进行记忆。

在这种情况下,我怎样才能取代memcpy呢?

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

我怎样才能使这门课变得简单可循呢?

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66596552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档