ValgRink在C++结构上抱怨未初始化的字节

ValgRink在C++结构上抱怨未初始化的字节,c++,initialization,valgrind,C++,Initialization,Valgrind,我已经通过问题提炼出了一个非常简单的例子,在这个例子中,我有一个正在初始化所有内容的结构构造函数,但是valgrind抱怨未初始化的字节。罪魁祸首似乎是类的布尔成员,这导致填充字节插入到size\t成员之前。初始化这些填充字节的正确方法是什么,这样valgrind就不会抱怨了 包括 包括 包括 包括 包括 包括 定义最大值128 typedef结构foo_结构 { foo_structcont std::string&name,bool q=true:qq { 如果name.size>MAX {

我已经通过问题提炼出了一个非常简单的例子,在这个例子中,我有一个正在初始化所有内容的结构构造函数,但是valgrind抱怨未初始化的字节。罪魁祸首似乎是类的布尔成员,这导致填充字节插入到size\t成员之前。初始化这些填充字节的正确方法是什么,这样valgrind就不会抱怨了

包括 包括 包括 包括 包括 包括 定义最大值128 typedef结构foo_结构 { foo_structcont std::string&name,bool q=true:qq { 如果name.size>MAX { 抛出std::runtime\u错误太大; } 点名称大小=名称大小; memsetn,0,sizeofn; memcpyn,name.c_str,name.size; } 布尔q; 尺寸\u t点\u名称\u尺寸; 字符n[MAX]; }富特; int main { intfd=open/tmp/foo,O|u WRONLY | O|u CREAT,0666; 如果-1==fd { 抛出std::runtime\u error无法创建文件描述符:+std::StringStrerrorNo; } 康斯特福特费罗; ssize_t write=writefd,&f,sizeoff; 标准::cout 初始化这些填充字节的正确方法是什么,这样valgrind就不会抱怨了

我不确定这样做的“正确方法”,但有几种可能性

为填充创建成员并对其进行初始化 此“通常”与64位系统上的结构大小相同。请参阅

如果你是可复制的,你就用0填充自己 初始化这些填充字节的正确方法是什么,这样valgrind就不会抱怨了

我不确定这样做的“正确方法”,但有几种可能性

为填充创建成员并对其进行初始化 此“通常”与64位系统上的结构大小相同。请参阅

如果你是可复制的,你就用0填充自己
将数据结构序列化为要写入大容量存储的字节块的正确方法是,编写一个序列化程序,将数据编码为所需的格式。依赖于标准中未指定的内容(如endianness或type Size),这完全是错误的


有很多可用的序列化库。

将数据结构序列化为要写入大容量存储的字节块的正确方法是编写一个序列化程序,将数据编码为所需的格式。依赖于标准中未指定的内容(如endianness或type size)是完全错误的


有很多的序列化库。请不要在C++中使用TyPulf。也保留了后缀。请不要在C++中使用Type。还保留了后缀。我同意这是正确的方法。然而,在我的实际应用中,串行化和反序列化的花费太大了,因为数据不是真的。ally写入文件,但通过线程之间的管道进行通信。因此,我的解决方案是将结构更改为联合{struct{}unpacket;void*packeted}。这样,我可以在联合构造函数期间初始化压缩指针,根据sizeofunpacked将memset设置为零,我的序列化程序是压缩指针:-@PaulGrinberg当线程共享所有内存时,为什么要在线程之间与管道通信?我知道线程共享内存。我需要向libev中传递数据并触发事件ent循环。最简单的方法之一是使用带有libev异步事件的管道对文件句柄执行非阻塞选择。@PaulGrinberg这正是互斥体和条件变量的用途。我同意这是正确的方法。但是,在我的实际应用程序中,序列化和反序列化的开销太大,因为数据实际上并没有写入文件,而是通过线程之间的管道进行通信。这样,我可以在联合构造函数期间初始化压缩指针,根据sizeofunpacked将memset设置为零,我的序列化程序是压缩指针:-@PaulGrinberg当线程共享所有内存时,为什么要在线程之间与管道通信?我知道线程共享内存。我需要向libev中传递数据并触发事件ent循环。最简单的方法之一是使用带有libev异步事件的管道对文件句柄执行非阻塞选择。@PaulGrinberg这正是互斥体和条件变量的用途。

==11790== Syscall param write(buf) points to uninitialised byte(s)
==11790==    at 0x54ED154: write (write.c:27)
==11790==    by 0x1093DE: main (in /home/gri6507/tmp/a.out)
==11790==  Address 0x1fff000251 is on thread 1's stack
==11790==  in frame #1, created by main (???:)
struct bar
{
  size_t point_name_size;
  char n[MAX];
  bool q;
  bool unused[7] ={};
};
struct bar
{
  bar()
  {
    static_assert(std::is_trivially_copyable_v<bar>);
    memset(this, 0, sizeof(bar));      
  }

  size_t point_name_size;
  char n[MAX];
  bool q;
};