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