我有一个分段错误,似乎找不到它

I have a segmentation fault and cannot seem to find it

本文关键字:找不到 有一个 分段 错误      更新时间:2023-10-16

当我运行它时,我遇到了分段错误,但我不确定它在哪里。这是在 c++ 中。任何帮助表示赞赏,提前感谢

    template<typename T>
    void My_vec<T>::insert_at_rank(int r, const T& elem){
        int init_size = size;
        if(r < 0){
            cerr << "Out of range"<<endl;
           exit(EXIT_FAILURE);
        }
        else if (r <= size) {
           ++size;
        }
        else
           size = r+1;
        if (size > capacity) {
           T* new_ptr = new T[capacity*2];
            for (int i = 0; i < capacity; i++) {
              new_ptr[i] = ptr[i];
            }
        capacity = 2 * capacity;
        delete[] ptr;
        ptr = new_ptr;
        free(new_ptr);
        }
        for(int i = size-1; i > r; i--){
            ptr[i] = ptr[i-1];
        }
        for (int i = init_size; i < r; i++) {
            ptr[i] = '0';
        }
        ptr[r] = elem;  
    }
    T* new_ptr = new T[capacity*2];  // allocates new array
    //...
    delete[] ptr;   // deletes previous array that 'ptr' pointed to
    ptr = new_ptr;  // repoints 'ptr' to the newly allocated array
    free(new_ptr);  // ???

问题#1:new_ptr分配了new []。要解除分配它,您必须使用 delete [] 而不是 free .

问题#2:ptr = new_ptr; ptr设置为指向与new_ptr相同的T[]数组。new-ptr被解除分配后ptr将指向未分配的空间。然而,后续代码试图在 ptr[i] 中取消引用它。这是UB(未定义的行为),让程序预先出现段错误实际上是所有场景中最幸运的。

相关文章: