memset for initialization in C++

匿名 (未验证) 提交于 2019-12-03 01:17:01

问题:

memset is sometimes used to initialize data in a constructor like the example below. Does it work in general ? Is it a good idea in general?

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

回答1:

Don't use memset. It's a holdover from C and won't work on non-PODs. Specifically, using it on a derived class that contains any virtual functions -- or any class containing a non-builtin -- will result in disaster.

C++ provides a specific syntax for initialization:

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

To be honest, I'm not sure, but memset might also be a bad idea on floating-points since their format is unspecified.



回答2:

It's a terrible idea. You're just tromping over data, paying no heed to how objects should be initialized. If your class is virtual, you're likely to wipe out the vtable pointer as well.

memset works on raw data, but C++ isn't about raw data. C++ creates abstractions, so if you want to be safe you use those abstractions. Use the initializer list to initialize members.

You can do it to POD types:

struct nothing_fancy_here {     bool b;     int i;     void* p; };  nothing_fancy_here x; memset(&x, 0, sizeof(x));

But if you're doing it on this, that means you're in a user-defined constructor and no longer qualify as a POD type. (Though if all your members are POD it might work, as long as none contain 0 as a trap value. I'm sure not sure if any other sources of undefined behavior come into play here.)



转载请标明出处:memset for initialization in C++
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!