相关疑难解决方法(0)

C++程序员应该避免memset吗?

我听说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有什么问题?

谢谢.

c++ initialization memset

36
推荐指数
5
解决办法
3万
查看次数

用于在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)

c++

16
推荐指数
2
解决办法
1万
查看次数

在c ++ 11中,您是否可以(安全地)用空的初始化程序替换memset()初始化?

我经常在代码中遇到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中是否可以用于任何类型?

c++ uniform-initialization c++11

10
推荐指数
1
解决办法
4279
查看次数

使用memset归零派生结构

我想将派生结构的所有成员归零.

每隔一段时间就有数百个成员和更多成员被添加,所以我觉得明确地初始化它们容易出错.

结构没有虚函数,所有成员字段都是内置的.然而,由于具有非平凡的构造函数,它们不是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)

谢谢.

c++ constructor sizeof memset

1
推荐指数
1
解决办法
1024
查看次数

为什么将结构清零导致失去对虚拟基类成员的访问权限?

 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?

c++ class visual-studio-2013

-5
推荐指数
1
解决办法
123
查看次数