Valgrind大小为4的读取无效,但未超出范围,也未堆叠';d、 马洛克';d或(最近)免费';D 我在Ubuntu 64位运行ValGRID-3.110时,用C++编写了我的程序,大小为N。

Valgrind大小为4的读取无效,但未超出范围,也未堆叠';d、 马洛克';d或(最近)免费';D 我在Ubuntu 64位运行ValGRID-3.110时,用C++编写了我的程序,大小为N。,valgrind,Valgrind,错误消息如下所示,其中N在1、4、8之间变化 Invalid read of size N. Address 0xblahblah is 88 bytes inside a block of size 176 alloc'd 大小176的块是一个C++类对象,分配了新的运算符,N的大小足够小,所以它不是边界外的情况。 那为什么Valgrind不告诉我原因,比如“没有堆叠”,“没有马洛塞德”,“最近被释放” 有人知道为什么Valgrind在没有诸如“未堆叠”、“未malloced”、“最近释放”

错误消息如下所示,其中N在1、4、8之间变化

Invalid read of size N.
Address 0xblahblah is 88 bytes inside a block of size 176 alloc'd

大小176的块是一个C++类对象,分配了新的运算符,N的大小足够小,所以它不是边界外的情况。 那为什么Valgrind不告诉我原因,比如“没有堆叠”,“没有马洛塞德”,“最近被释放”


有人知道为什么Valgrind在没有诸如“未堆叠”、“未malloced”、“最近释放”之类的消息时将其判定为无效读取吗?

N对应于底层基本数据类型的大小。粗略地说,1是char或bool,4是and int或float,8是long int、double或pointer

XX bytes inside a block of size YY alloc'd
首先,这意味着内存是动态的(在堆上),而不是自动的(在堆栈上)。其次,您知道分配的对象的大小。如果您知道每个对象的大小(您可以使用sizeof来获得它),那么您可以计算出分配了多少个对象

在此之前还有其他严重错误吗


您的代码中是否使用了Valgrind客户端请求?

N对应于底层基本数据类型的大小。粗略地说,1是char或bool,4是and int或float,8是long int、double或pointer

XX bytes inside a block of size YY alloc'd
首先,这意味着内存是动态的(在堆上),而不是自动的(在堆栈上)。其次,您知道分配的对象的大小。如果您知道每个对象的大小(您可以使用sizeof来获得它),那么您可以计算出分配了多少个对象

在此之前还有其他严重错误吗


您的代码中是否使用了Valgrind客户端请求?

“N的大小足够小,这不是越界情况。”非sequitur。N的大小通常是寄存器大小的2的幂。与访问是否超出范围无关。@RaymondChen谢谢你的评论,但我不理解你的意思。当N为8时,88+8仍然在分配的176字节块内,因此我决定Valgrind没有将此报告为错误,因为越界访问。哦,好的。它是N与未超出范围的偏移的组合。你试图责怪N,所以我没有看其他部分。也许它正在报告对齐错误?(进一步阅读,N最多为48,这与对齐理论不符。)“N的大小足够小,不超出范围。”。N的大小通常是寄存器大小的2的幂。与访问是否超出范围无关。@RaymondChen谢谢你的评论,但我不理解你的意思。当N为8时,88+8仍然在分配的176字节块内,因此我决定Valgrind没有将此报告为错误,因为越界访问。哦,好的。它是N与未超出范围的偏移的组合。你试图责怪N,所以我没有看其他部分。也许它正在报告对齐错误?(进一步阅读,N最多为48,这与对齐理论不符。)感谢您的回复。我不使用Valgrind客户端请求。对于你提到的“严重错误”,回答起来有点复杂,因为我和其他同事一起工作。我的一位同事说,在我从未见过的“无效读取”之前有“条件跳转或移动取决于未初始化的值”。无论如何,在删除“未初始化值访问错误”后,似乎不再有“无效读取”。然而,我仍然不明白,如果没有诸如“未堆叠”、“未malloced”、“最近释放”等无效的确切原因,这怎么会导致“无效读取”。感谢您的回复。我不使用Valgrind客户端请求。对于你提到的“严重错误”,回答起来有点复杂,因为我和其他同事一起工作。我的一位同事说,在我从未见过的“无效读取”之前有“条件跳转或移动取决于未初始化的值”。无论如何,在删除“未初始化值访问错误”后,似乎不再有“无效读取”。然而,我仍然不明白,如果没有诸如“未堆叠”、“未malloced”、“最近释放”等无效的确切原因,这怎么会导致“无效读取”。