【问题标题】:Regarding Possible Lost in Valgrind关于可能在 Valgrind 中丢失
【发布时间】:2012-11-22 18:27:10
【问题描述】:

如果我们像这样将字符串推入向量会有什么问题:

globalstructures->schema.columnnames.push_back("id");

当我在我的代码上应用 valgrind 时,它会显示

可能在 1 个块中丢失了 27 个字节,可能在 19 个丢失记录 7 中丢失。

像这样在很多地方它显示可能丢失......因此分配和释放不匹配......这导致一些奇怪的错误,如

malloc.c:没有这样的文件或目录

虽然我在代码中的任何地方都使用 calloc 分配内存,但我收到了类似的警告

系统调用参数 write(buf) 指向未初始化的字节

导致该错误的代码是

  datapage *dataPage=(datapage *)calloc(1,PAGE_SIZE);               
  writePage(dataPage,dataPageNumber); 
             
                     
  int writePage(void *buffer,long pagenumber)                 
  {
    int fd;
    fd=open(path,O_WRONLY, 0644);

     if (fd < 0)
        return -1;

    lseek(fd,pagenumber*PAGE_SIZE,SEEK_SET);

     if(write(fd,buffer,PAGE_SIZE)==-1)
    return false;


      close(fd);
      return true;
  }

我在运行 gdb 时遇到的确切错误是...

断点 1,getInfoFromSysColumns (tid=3, numColumns=@0x7fffffffdf24: 1, typesVector=..., constraintsVector=..., lengthsVector=..., columnNamesVector=..., offsetsVector=...) 在 dbheader.cpp:1080

程序收到信号SIGSEGV,分段错误。

_int_malloc (av=0x7ffff78bd720, bytes=8) at malloc.c:3498 3498 malloc.c: 没有这样的文件或目录。

当我通过 valgrind 运行相同的程序时,它工作正常......

【问题讨论】:

  • 如果 shema.columnnamesstd::vector&lt;std::string&gt; 那么 push_back 没有问题。
  • 你为什么在 C++ 代码中“到处使用calloc”???
  • @juanchopanza:valgrind 有时会在实现内存池方案方面遇到问题(我有时会在 GCC 中看到),但是根据给定的信息无法判断这是否是问题所在。
  • @honk 当然,由于某些自定义内存管理,“可能丢失”通常是误报。但是将const char* 推入向量是安全的。
  • 关于 calloc 当我使用 malloc 时...我得到一些垃圾值...而不是再次应用 memset ....我使用了 calloc.. .是否有任何性能问题...

标签: c++ vector valgrind


【解决方案1】:

嗯,

malloc.c:No such file or directory

当您使用 gdb 进行调试并且您在 malloc 附近使用命令“s”而不是“n”时可能会发生这种情况,这实际上意味着您正在尝试进入 malloc,其源代码可能在您的 Linux 机器上不可用。

这也许是它在 valgrind 上运行良好的原因。

【讨论】:

    【解决方案2】:

    为什么会在 malloc 中出错:

    问题是您覆盖了一些内存缓冲区并损坏了一个 内存管理器使用的结构。 (c)

    尝试使用 --track-origins=yes 运行 valgrind 并查看未初始化访问的来源。如果你认为它应该被初始化而它不是,也许数据来自一个错误的指针,valgrind 会告诉你这些值是在哪里创建的。可能那些未初始化的值会覆盖你的缓冲区,包括内存管理器的特殊字节。

    此外,请在崩溃之前查看所有 valgrind 警告

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2019-01-24
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多