细分错误

时间:2019-01-08 05:58:16

标签: c++ linux cygwin

#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环境中使用。

3 个答案:

答案 0 :(得分:3)

您的问题是由您对setArrayb下一行的误解引起的。

int *b = new int [n_elements + 1];     
  1. 它将初始化函数局部变量b
  2. 它对相同名称的成员变量没有任何作用。
  3. 它会泄漏内存。

访问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中。