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];     
  1. 它初始化一个函数局部变量b
  2. 对同名成员变量不做任何处理
  3. 内存泄漏。

当您访问storeArray中的成员变量b的元素时,您访问的是一个未初始化的指针,这会导致未定义的行为。

将该行更改为

b = new int [n_elements + 1];     

除非您需要在代码中管理动态分配的内存,否则请将您的 class 更改为使用 std::vector<int>

如果您必须自己管理内存,请遵循The Rule of Three