实现一个动态数组(我可以访问不存在的位置)

Implemet an dinamic array ( I have access to positions that can't exist)

出于某种原因,我的实现允许 0 大小的数组访问 0 个位置,5 个大小的数组访问 50 个位置。从我的角度来看,这两个职位都必须让我出现分段错误。我想可能是内存分配错误导致的,但在我这边看起来是对的,有人可以告诉我为什么我得到那个结果。

我的数组代码:

class vector{
 private:
  int length;
  int cap;
  T* arr;
 public:

  vector(int n){
   arr = new T[n];
   length = n;
   cap = n;
  }

  vector():vector(0){};

  vector(vector<T> & other){
   arr = new T[other.size()];
   length = other.size();
   cap = other.capacity();
  }
  ~vector(){
   delete[] arr;
  }

  T& operator[](int ind) {
   return arr[ind];
  }

  const T& operator[](int ind) const{
   return arr[ind];
    }
};

我的测试:

 int main(int argc, char* argv[])
 {
  vector<int> v;
  v[0] = 5;
  vector<int> v2(5);

  std::cout<<v2[50]<<" "<<v[0]<<std::endl;
 }

输出:

  0 0

标准说这是一个未定义的行为,而不是分段错误

之所以有效,是因为 (arr + 50) 是为您的程序保留的内存位置。

还要记住位置总是存在的(好吧,如果你不在你的 RAM 的最后一个字节):在物理层面上它们只是位,所以那里总是有一些东西。

如果您尝试访问例如 v[12345678],这可能会导致分段错误。

无论如何,这是一个未定义的行为,所以从不依赖这些影响。

您没有检查函数的参数。

你应该做的是

T& operator[](int ind) {
    if(ind >= 0 && ind < length)
        return arr[ind];
    else
        throw(std::out_of_range("vector"));
}