c++ - 这样使用memset好不好?

标签 c++ memset

我是这样使用 memset 的:

class A {
    public:
       A();
    private:
       int a;
       float f;
       char str[35];
       long *lp;
    };

    A::A()
    {
       memset(this, 0, sizeof(*this));
    }
}

我应该这样使用吗?为什么和为什么不呢?有没有更好的办法?需要一些指导..

最佳答案

这通常是个坏主意。

如果有人向类中添加一个新成员,如果新成员的类型具有适当的构造函数并且 memset 不合适,则它可能会严重崩溃。

形式上,根据标准,您的用户定义的构造函数意味着 A 不是 POD 类型(或 C++11 中的平凡可复制类型),因此使用 memsetmemcpy 就可以了。

有几种方法可以安全地做到这一点:

A::A() : a(), f(), str(), lp()
{ }

或者,不添加构造函数和值初始化类型的实例:

A a = A();

或者,将 POD 成员组合在一起并在构造函数中一次对它们进行值初始化:

class A {
public:
  A();
private:
  struct Data {
    int a;
    float f;
    char str[35];
    long *lp;
  };
  Data data;
};

A::A() : data()
{ }

一般来说,最好在 C++ 中使用值初始化并依靠编译器执行与 memset 等效的操作(或调用默认构造函数),而不是显式使用 memset 你自己。代码将不那么脆弱并且更易于维护。

关于c++ - 这样使用memset好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22632960/

相关文章:

c++ - 这两个memset有什么区别?

c++ - 什么会导致流进入 "bad"状态?

c++ - vector 中元素的默认构造

c++ - 将 char* 转换为 char? C++

c - 在玩具示例中使用 '\0' 进行 memset 的必要性

c++ - 免费(): invalid next size (fast): 0x0000000000f45160 ***

c++ - 类成员内存分配

c++ - 如何在 C/C++ 中获取用于流式传输的 mp3 音频数据包

Eclipse 给了我无效参数 ' Candidates are: void * memset(void *, int, ?) ' 虽然我知道参数很好

c++ - 将 memset 从 C 替换/移植到 C++