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

C++ 在这种情况下,如何正确释放内存,c++,arrays,loops,pointers,valgrind,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

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

我不明白为什么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;

}
int n=0;
cin>>n;
浮点*矩阵;
矩阵=新浮点数[n*3];
对于(int i=0;i>*(矩阵+i*3+j);
}
}
int*圈数的数组=findIntersection(矩阵,n);
对于(int i=0;i

您没有初始化
数组中的所有元素,数组中的元素是圈中的元素

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

根据
//此处的某些代码中的内容,可能存在未初始化的数组其他元素。

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


您没有初始化
数组中的所有元素,数组中的元素是圈中的元素

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


根据
//此处的某些代码中的内容,数组中可能还有其他未初始化的元素。

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


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

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


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

使用std::vector自动删除内存并检查缓冲区溢出。您确定“这里有一些代码”吗不包含一些
continue
break
语句?我的观点是-是否100%确定
array\u of \u numbers\u of \u circles
的所有元素都是真正初始化的?您也可以使用调试器检查这一点。为什么使用
*(matrix+i*3+j)
而不是更常见和简单的
矩阵[i*3+j]
?您不会初始化
array\u of\u numbers\u of\u of \u circles
的所有元素。当外部循环中的
i==n-1
时,内部循环执行0次。因此索引
2*n-2
2*n-1
处的元素不会初始化。但是,它们会在
main
中,在
if>行中使用*(圈数的数组+i*2+j)!=0)
@KirilKirov“这里有一些代码”(我只是在这里检查smth的代码,如果是:我做*(圈数的数组+i*2+0)=i+1;*(圈数的数组+i*2+1)=j+1;使用std::vector自动删除内存并检查缓冲区溢出。是否确定“此处的某些代码”不包含一些
continue
break
语句?我的观点是-是否100%确定
array\u of \u numbers\u of \u circles
的所有元素都是真正初始化的?您也可以使用调试器检查这一点。为什么使用
*(matrix+i*3+j)
而不是更常见和简单的
矩阵[i*3+j]
?您不会初始化
array\u of\u numbers\u of\u of \u circles
的所有元素。当外部循环中的
i==n-1
时,内部循环执行0次。因此索引
2*n-2
2*n-1
处的元素不会初始化。但是,它们会在
main
中,在
if>行中使用*(圈数的数组+i*2+j)!=0)
@KirilKirov“这里有一些代码”(我只是在这里检查smth的代码,如果是:我做*(圈数的数组+i*2+0)=i+1;*(圈数的数组+i*2+1)=j+1;//这里的一些代码只表示我检查smth的代码行,如果它是正确的,我会这样做*(圈数的数组+I*2+0)=I+1;*(圈数的数组+I*2+1)=j+1;//这里的一些代码只表示我检查smth的代码行,如果它是正确的,我会这样做*(圈数的数组+I*2+0)=i+1;*(圈数数组+i*2+1)=j+1;+1。我不理解为什么人们坚持在没有迫切需要的情况下到处扔指针。我不理解为什么人们坚持在没有迫切需要的情况下到处扔指针。