2014-07-22 36 views
0

我正在为我的项目寻找内存泄漏。我收到一个错误,我无法理解它的根本原因。我的代码很大,所以我会在这里放大块。Valgrind错误 - 分配后的地址为零字节 - C/C++

基本上我有在一个函数的阵列称为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) 

以下错误我调试到这一点,我发现我有必要填充数组中的所有值。谁能告诉我这个错误究竟意味着什么?

回答

5

您正在阅读的内容超出rmsArray的末尾。

那是因为你把N作为数组的大小,当实际大小为N-pulse_samplewidth+1,小于N假设pulse_samplewidth大于1

+0

是的,我是。为什么我之前没有注意到它如此大胆可见?无论如何非常感谢。 –