我听说c ++程序员应该避免使用memset,
class ArrInit {
//! int a[1024] = { 0 };
int a[1024];
public:
ArrInit() { memset(a, 0, 1024 * sizeof(int)); }
};
Run Code Online (Sandbox Code Playgroud)
所以考虑到上面的代码,如果你不使用memset,怎么能把[1..1024]填充为0?在C++中memset有什么问题?
谢谢.
memset有时用于在构造函数中初始化数据,如下例所示.它一般有效吗?一般来说这是个好主意吗?
class A {
public:
A();
private:
int a;
float f;
char str[35];
long *lp;
};
A::A()
{
memset(this, 0, sizeof(*this));
}
Run Code Online (Sandbox Code Playgroud) 我经常在代码中遇到POD结构,这些结构是手动零初始化的,memset如下所示:
struct foo;
memset(&foo, 0, sizeof(foo));
Run Code Online (Sandbox Code Playgroud)
我检查了C++ 11标准,它说:"一个对象,其初始化器是一组空的括号,即(),应该进行值初始化." 接下来是: "对T类型的[pod结构]进行值初始化意味着...对象被零初始化."
所以......这是否意味着您可以随时安全地将上述代码压缩为以下代码:
struct foo{};
Run Code Online (Sandbox Code Playgroud)
并且有一个保证初始化的结构,就好像你已经调用了一样memset(&foo, 0, ...)?
如果是这样,那么一般来说,你可以使用空的初始化器安全地初始化任何东西,如下所示:
SomeUnknownType foo{}; // will 'foo' be completely "set" to known values?
Run Code Online (Sandbox Code Playgroud)
我知道在C++ 03中(在统一初始化语法之前)并不总是可行的,但现在C++ 11中是否可以用于任何类型?
我想将派生结构的所有成员归零.
每隔一段时间就有数百个成员和更多成员被添加,所以我觉得明确地初始化它们容易出错.
结构没有虚函数,所有成员字段都是内置的.然而,由于具有非平凡的构造函数,它们不是POD.
除了练习的标准皱眉外,您是否看到以下任何问题?
struct Base
{
// Stuff
};
struct Derived : public Base
{
// Hundreds of fields of different built-in types
// including arrays
Derived()
{
::memset(reinterpret_cast<char*>this + sizeof (Base), 0, sizeof *this - sizeof (Base));
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢.
struct base
{
int num;
char ch;
float fl;
};
struct ss : virtual base
{
};
void main()
{
ss sa;
sa.num = 100;
cout << sa.num << endl;
memset(&sa, 0, sizeof(sa)); // set all members to zero
cout << sa.num << endl; // Access violation reading location 0x00000004.
}
Run Code Online (Sandbox Code Playgroud)
我可以从一个从虚拟基础派生的结构中访问成员.将结构清零时,它也会导致失去对成员的访问权限.这是否意味着我们必须单独清除成员而不是使用memset或ZeroMemory?