我正在为我的项目进行内存泄漏。我收到一个错误,我无法理解它的根本原因。我的代码非常庞大,所以我会在这里放置所需的块。
基本上我在一个名为find_pulses
的函数中有一个数组,我可以像这样动态分配:
float*rmsArray;
rmsArray = (float*)malloc((N-pulse_samplewidth+1)*sizeof(float));
我调试到这一点,发现N-pulse_samplewidth+1
不为零。 (实际上 ~2 ^ 21 )
我将值填充到此数组中:
for (int loop1 = 0; loop1 < N-pulse_samplewidth; ++loop1) {
// populate rms array here.
}
我将此数组发送到另一个名为findpeak
的函数,如下所示:
int* ans = findpeak(rmsArray,N,pulse_samplewidth,startsec,min,max,x);
findpeak
的声明是这样的:
int* findpeak(float* data, int n, int pulse_samplewidth,float startsec,float min,float max, float* x);
在findpeak
函数中,我将data
中的特定值添加到这样的堆栈中:
std::stack<float> peaks_y;
for (int loop1 = 0; loop1 < n; ++loop1) {
if( some condition)
{
peaks_y.push(data[loop1]); // point of error.
}
}
我把它推到堆栈的地方,我在valgrind上得到以下错误
==17917== Invalid read of size 4
==17917== at 0x4109C2: findpeak(float*, int, int, float, float, float, float*) (stat_utility.C:358)
==17917== by 0x410778: find_pulses(int, float*, int, int, float) (stat_utility.C:321)
==17917== by 0x410F46: find_pulses(int, floatcomplex *, int, int, float) (stat_utility.C:426)
==17917== by 0x403385: main (DetectRFI.C:207)
==17917== Address 0x18796c20 is 0 bytes after a block of size 8,326,112 alloc'd
==17917== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17917== by 0x410507: find_pulses(int, float*, int, int, float) (stat_utility.C:285)
==17917== by 0x410F46: find_pulses(int, floatcomplex *, int, int, float) (stat_utility.C:426)
==17917== by 0x403385: main (DetectRFI.C:207)
我调试到这一点,我发现我必须在阵列上填充所有值。任何人都可以告诉我错误实际意味着什么?
答案 0 :(得分:5)
您在rmsArray
结束后阅读。
这是因为您将N
视为数组大小,当实际大小为N-pulse_samplewidth+1
时,假设N
大于pulse_samplewidth
,则小于{{1}} 1。