前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++核心准则C.90:依靠构造函数和赋值运算符,而不是内存初始化和内存拷贝‍

C++核心准则C.90:依靠构造函数和赋值运算符,而不是内存初始化和内存拷贝‍

作者头像
面向对象思考
发布2020-03-25 16:30:36
9460
发布2020-03-25 16:30:36
举报

C.90: Rely on constructors and assignment operators, not memset and memcpy

C.90:依靠构造函数和赋值运算符,而不是内存初始化和内存拷贝‍

Reason(原因)

The standard C++ mechanism to construct an instance of a type is to call its constructor. As specified in guideline C.41: a constructor should create a fully initialized object. No additional initialization, such as by memcpy, should be required. A type will provide a copy constructor and/or copy assignment operator to appropriately make a copy of the class, preserving the type's invariants. Using memcpy to copy a non-trivially copyable type has undefined behavior. Frequently this results in slicing, or data corruption.

标准C++机制通过调用构造函数构造某个类型的实例。正如C.41说明的:构造函数应该生成一个完全初始化的对象。不应该要求额外的初始化,例如使用memcpy。类型应该提供一个拷贝构造函数和/或者拷贝复制运算符以便适当地生成类的拷贝并维持类的不变量。使用memcpy拷贝一个非平常可拷贝类型的行为没有定义。通常会导致断层或者数据破坏。

Example, good(范例)

代码语言:javascript
复制
struct base
{
    virtual void update() = 0;
    std::shared_ptr<int> sp;
};

struct derived : public base
{
    void update() override {}
};

Example, bad(反面示例)

代码语言:javascript
复制
void init(derived& a)
{
    memset(&a, 0, sizeof(derived));
}

This is type-unsafe and overwrites the vtable.

这个函数类型不安全而且会覆盖虚函数表。

Example, bad(反面示例)‍

代码语言:javascript
复制
void copy(derived& a, derived& b)
{
    memcpy(&a, &b, sizeof(derived));
}

This is also type-unsafe and overwrites the vtable.

这个函数同样是类型不安全而且覆盖虚函数表。

Enforcement(实施建议)‍

  • Flag passing a non-trivially-copyable type to memset or memcpy.
  • 提示向memset或memcpy传递非平凡可拷贝类型的处理。

关于平凡拷贝请参见:

https://zh.cppreference.com/w/cpp/named_req/TriviallyCopyable‍

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c90-rely-on-constructors-and-assignment-operators-not-memset-and-memcpy


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档