C++ 在这种情况下,如何正确释放内存
在这种情况下,如何正确释放内存 我不明白为什么VALGRIND写道我有: “条件跳转或移动取决于未初始化的值” 这是主要功能: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
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。我不理解为什么人们坚持在没有迫切需要的情况下到处扔指针。我不理解为什么人们坚持在没有迫切需要的情况下到处扔指针。