2014-03-31 70 views
1

如何在这种情况下正确释放内存?如何在这种情况下正确释放内存

我不明白为什么Valgrind的写道:我有:

“条件跳转或移动依赖于未初始化值(S)”

这是主要功能:

int n=0; 
cin >> n; 
float* matrix; 

matrix = new float [ n * 3 ]; 

for(int i = 0; i < n; i++) { 
    for(int j = 0; j < 3; j++) { 
     cin >> *(matrix + i * 3 + j); 
    } 
} 

int* array_of_numbers_of_circles = findIntersection(matrix,n); 

for(int i = 0; i < n; i++) { 
    for(int j = 0; j < 2; j++) { 
     if(*(array_of_numbers_of_circles + i * 2 + j) != 0) { //it writes error in if; 
      cout << *(array_of_numbers_of_circles + i * 2 + j) << " "; 
     } 
    } 
    if(*(array_of_numbers_of_circles + i * 2 + 0) != 0 && 

    *(array_of_numbers_of_circles + i * 2 + 1) != 0) { //it writes error in if here too; 
     cout << "\n"; 
    } 
} 

delete[] matrix; 
delete[] array_of_numbers_of_circles; 

和功能:

int* findIntersection(float matrix[], int n) { 
//some variables 

int* array_of_numbers_of_circles; 

array_of_numbers_of_circles = new int [ n * 2 ]; 

for(int i = 0; i < n; i++) { 
    for(int j = i + 1; j < n; j++) { 
     //some code here 


     *(array_of_numbers_of_circles + i * 2 + 0) = i + 1; 
     *(array_of_numbers_of_circles + i * 2 + 1) = j + 1; 

    } 
} 

return array_of_numbers_of_circles; 

} 

有什么问题?我不明白为什么VALGRIND会说这样的错误

先谢谢您了!

+0

使用std :: vector自动删除内存并检查缓冲区溢出。 –

+0

你确定,这里的“一些代码”不包含一些'continue'或'break'语句吗?我的观点是 - 是否100%确定,'array_of_numbers_of_circles'的_all_元素是_really_initialized?你也可以用调试器来检查它。 –

+1

为什么使用'*(矩阵+我* 3 + j)'而不是更常见和简单的'矩阵[i * 3 + j]'? – HEKTO

回答

5

首先,警告“条件跳转或移动取决于未初始化的值”与您是否正确释放内存无关。

您不初始化array_of_numbers_of_circles的所有元素。

当外循环中i == n-1时,内循环执行0次。因此索引2 * n - 22 * n - 1中的元素未被初始化。但是,它们用于main,在行if(*(array_of_numbers_of_circles + i * 2 + j) != 0)

根据//some code here中的内容,该数组可能还有其他元素未被初始化。

+0

//这里的一些代码意味着只有代码行我检查smth,如果它是正确的,我这样做*(array_of_numbers_of_circles + i * 2 + 0)= i + 1; *(array_of_numbers_of_circles + i * 2 + 1)= j + 1; –

1

正如错误消息提示的那样,这可能是因为Valgrind认为您在初始化它们之前以某种方式使用了值。尝试使用Valgrind标志来告诉你未初始化值的来源在哪里。

回答您的原题“在这种情况下如何正确释放内存?”,我强烈建议你切换到使用std::vectorstd::auto_ptr来使你的代码更加可靠和健壮。

+0

+1。我不明白为什么人们坚持扔C指针,C风格,没有迫切的需要。 – DevSolar

相关问题