0

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

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 运行它时,它工作正常......

4

2 回答 2

3

好,

malloc.c:No such file or directory

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

这也许就是为什么它可以与 valgrind 一起正常工作的原因。

于 2012-11-23T11:12:33.113 回答
0

为什么错误在malloc中:

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

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

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

于 2012-11-22T21:28:41.437 回答