关于创建指针数组来实现对一个二维数组,结果出现段错误

关于创建指针数组来实现对一个二维数组的描述,编译之后出现段错误,并提示了Process returned -1073741819 (0xC0000005)

template<int guide_candidate_mem>
class Guide_Candidate_Part 
{      
private:
    uint8_t counter_size,shift; 
    uint32_t mask,counter_max,buf,adj_val;
    int h, w = guide_candidate_mem* 1024/4; //w是计数器大小8bit的行计数器数量,实为*1024*8/4/8
    uint32_t *counters[4];  
    int idx[d],val[d];
    uint32_t min_value = 1 << 30;
    BOBHash32 * hash[d]; //两个哈希  
public:
Guide_Candidate_Part() {}  
    Guide_Candidate_Part(uint32_t in_w,uint32_t in_h, uint8_t in_counter_size,uint32_t random_seed) //属性
    {
        init(in_w, in_h, in_counter_size, random_seed);  
    }
    ~Guide_Candidate_Part() { clear(); }  //析构函数

    void init(uint32_t in_w, uint32_t in_h, uint8_t in_counter_size,uint32_t random_seed){
        w= in_w,h = in_h, counter_size = in_counter_size;  
        counters[0]=new uint32_t[4*w];  //将指针数组指向了行一维数组的首地址,并分配4W个大小的内存空间
        counters[1]=new uint32_t[4*w];
        counters[2]=new uint32_t[2*w];
        counters[3]=new uint32_t[w];//这已经声明了数组的计数器类型是uint32_t

        mask = counter_max = (1u << counter_size) - 1;     
        
        srand((unsigned)time(NULL));
        std::random_device rd;  //产生不同的随机数种子
        for(int i =0; i< d; i++)
            hash[i] = new BOBHash32(rd());  
    }

    void clear()
    {
        for(int j=0; j< 4; j++)
            delete[]counters[j]; 
        if(hash) delete [] hash;
    }

之后为了对该二维数组其中的一维实现两次哈希操作,结果数据集跑了一部分之后发生了段错误,调试的话没有指出具体哪块发生问题,只是显示哈希部分错误,如图所示

img

img

想知道是哪块代码出问题了,感觉还是二维数组以及指针数组的问题

if(hash) delete [] hash;
这是不对的。hash不是动态分配的数组,但hash的元素是动态分配的指针。你得和counters一样,用循环来释放