class 中的分段错误
Segmentation fault in class
#include <iostream>
using namespace std;
class Bucket{
public:
Bucket();
void setN(int n);
void setArrayb();
void storeArray(int s, int cc, int **A);
int showdata(int cc);
private:
int n_elements;
int *b;
};
Bucket :: Bucket(){
;
}
void Bucket :: setN(int n)
{
n_elements = n;
}
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
void Bucket :: storeArray(int s, int cc, int **A){
cout << this -> n_elements;
if(cc <= n_elements){
this -> b[cc] = A[0][s];
}
}
int Bucket :: showdata(int cc){
return this -> b[cc];
}
int main(){
int n = 10;
int** A = new int*[1];
for (int i = 0 ; i < 1 ; i++){
A[i] = new int [n + 1];
}
Bucket B[n + 1];
A[0][3] = 6;
int fb = 10;
B[1].setN(fb) ;
B[1].setArrayb();
B[1].storeArray(3, 1, A);
cout << B[1].showdata(1);
}
我正在尝试对A完成n个桶的bucketsort。n_element是每个桶的编号,编译后是合法的。但是当我执行它时,它导致分段 fault.Can 有人解释一下这段代码发生了什么?
Cygwin 在 linux 环境中使用。
在这个部分
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
你应该写b = new int [n_elements + 1];
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
它分配内存并将指向它的指针存储到局部变量 b
,而不是 this->b
。
您的问题是由于您对 setArrayb
.
中以下行的作用有误解造成的
int *b = new int [n_elements + 1];
- 它初始化一个函数局部变量
b
。
- 对同名成员变量不做任何处理
- 内存泄漏。
当您访问storeArray
中的成员变量b
的元素时,您访问的是一个未初始化的指针,这会导致未定义的行为。
将该行更改为
b = new int [n_elements + 1];
除非您需要在代码中管理动态分配的内存,否则请将您的 class 更改为使用 std::vector<int>
。
如果您必须自己管理内存,请遵循The Rule of Three。
#include <iostream>
using namespace std;
class Bucket{
public:
Bucket();
void setN(int n);
void setArrayb();
void storeArray(int s, int cc, int **A);
int showdata(int cc);
private:
int n_elements;
int *b;
};
Bucket :: Bucket(){
;
}
void Bucket :: setN(int n)
{
n_elements = n;
}
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
void Bucket :: storeArray(int s, int cc, int **A){
cout << this -> n_elements;
if(cc <= n_elements){
this -> b[cc] = A[0][s];
}
}
int Bucket :: showdata(int cc){
return this -> b[cc];
}
int main(){
int n = 10;
int** A = new int*[1];
for (int i = 0 ; i < 1 ; i++){
A[i] = new int [n + 1];
}
Bucket B[n + 1];
A[0][3] = 6;
int fb = 10;
B[1].setN(fb) ;
B[1].setArrayb();
B[1].storeArray(3, 1, A);
cout << B[1].showdata(1);
}
我正在尝试对A完成n个桶的bucketsort。n_element是每个桶的编号,编译后是合法的。但是当我执行它时,它导致分段 fault.Can 有人解释一下这段代码发生了什么?
Cygwin 在 linux 环境中使用。
在这个部分
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
你应该写b = new int [n_elements + 1];
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
它分配内存并将指向它的指针存储到局部变量 b
,而不是 this->b
。
您的问题是由于您对 setArrayb
.
int *b = new int [n_elements + 1];
- 它初始化一个函数局部变量
b
。 - 对同名成员变量不做任何处理
- 内存泄漏。
当您访问storeArray
中的成员变量b
的元素时,您访问的是一个未初始化的指针,这会导致未定义的行为。
将该行更改为
b = new int [n_elements + 1];
除非您需要在代码中管理动态分配的内存,否则请将您的 class 更改为使用 std::vector<int>
。
如果您必须自己管理内存,请遵循The Rule of Three。