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

时间:2014-03-31 14:02:22

标签: c++ arrays loops pointers valgrind

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

我不明白为什么VALGRIND会写我有:

“条件跳转或移动取决于未初始化的值”

这是主要功能:

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会说出这样的错误

提前谢谢!

2 个答案:

答案 0 :(得分:5)

首先,警告&#34;条件跳转或移动取决于未初始化的值&#34;与你是否正确释放记忆无关。

您不会初始化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中的内容,可能还有其他未初始化的元素。

答案 1 :(得分:1)

正如错误消息所示,这可能正在发生,因为Valgrind认为您在初始化之前以某种方式使用值。尝试使用Valgrind标志来告诉您未初始化值的来源。

回答原始问题&#34;如何在这种情况下正确释放内存?&#34; ,我强烈建议您切换到使用std::vector和{ {1}}使您的代码更可靠,更健壮。