#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);
}
我正在尝试使用n个存储桶来完成A的存储桶排序。n_element是每个存储桶的编号,经过编译,这是合法的。但是当我执行它时,它会导致分段错误。有人可以解释这段代码发生了什么吗?
在cygwin的Linux环境中使用。
答案 0 :(得分:3)
您的问题是由您对setArrayb
下一行的误解引起的。
int *b = new int [n_elements + 1];
b
。访问b
中成员变量storeArray
的元素时,将访问未初始化的指针,这将导致未定义的行为。
将该行更改为
b = new int [n_elements + 1];
除非需要在代码中管理动态分配的内存,否则请更改类以使用std::vector<int>
。
如果您必须管理自己的内存,请按照The Rule of Three进行操作。
答案 1 :(得分:2)
在此部分
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
您应该写b = new int [n_elements + 1];
答案 2 :(得分:0)
void Bucket :: setArrayb(){
int *b = new int [n_elements + 1];
}
它分配内存并将指向它的指针存储到局部变量b
中,而不是this->b
中。