c - valgrind 地址在分配大小为 4 的块后为 0 字节
问题描述
我正在研究一个数学库。
create_vector创建一个维度为 n 的向量:(v1, v2, v3, ..., vn)
delete_vector释放内存。
struct Vector
{
unsigned int dimension;
double *components;
};
typedef struct Vector *vector_t;
vector_t create_vector(const unsigned int dimension)
{
if(!dimension)
return NULL;
vector_t vector = (vector_t)malloc(sizeof(struct Vector));
vector->dimension = dimension;
vector->components = (double *)calloc(dimension, sizeof(double));
return vector;
}
void delete_vector(vector_t *vector)
{
if(*vector == NULL)
return;
free((*vector)->components);
free(*vector);
*vector = NULL;
}
主文件:
int main()
{
vector_t vector1 = create_vector(3);
delete_vector(&vector1);
}
在主文件中,我使用了这两个函数,但 valgrind 给了我这些警告。没有任何内存泄漏。我该如何解决?
==6906== Invalid write of size 4
==6906== at 0x108800: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906== by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906== Address 0x4b3702c is 0 bytes after a block of size 4 alloc'd
==6906== at 0x483021B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6906== by 0x1087DC: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906== by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==
==6906== Invalid read of size 4
==6906== at 0x10882B: delete_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906== by 0x108790: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906== Address 0x4b3702c is 0 bytes after a block of size 4 alloc'd
==6906== at 0x483021B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6906== by 0x1087DC: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906== by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==
==6906==
==6906== HEAP SUMMARY:
==6906== in use at exit: 0 bytes in 0 blocks
==6906== total heap usage: 2 allocs, 2 frees, 28 bytes allocated
==6906==
==6906== All heap blocks were freed -- no leaks are possible
==6906==
==6906== For counts of detected and suppressed errors, rerun with: -v
==6906== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
解决方案
你确定你不编译malloc(sizeof(vector_t));
而不是 withmalloc(sizeof(struct Vector));
吗?
大小为 4 的块分配表示您malloc只有 4 个字节是指针的大小如果您有 32b CPU,则结构的大小最小为 8 个字节
推荐阅读
- macros - 在 guile 方案中,如何防止从另一个宏调用宏时重命名?
- python - 自动完成在 git hook 中不起作用,tty 问题?
- terraform - 如何在 Terraform 中为机密使用环境变量
- excel - 如何组合 SUMIF 的 Excel 公式并在文本字符串中查找数字?
- python - TypeError:无法解压不可迭代的 numpy.float64 对象
- node.js - 这段代码是什么意思?(Pug 模板引擎)
- angular - 我们可以 HTTP 2 服务器推送其他 CDN 中的资产吗?
- apache-nifi - 如何为 AttributeToJSON 处理器将属性设置为数组?
- python - 合并填充的行单元格并忽略Python中的空单元格
- c++ - 在 c++ WWSAPI Web 服务中处理 WS-Security PasswordDigest 模式