实现一个动态数组(我可以访问不存在的位置)
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"));
}
出于某种原因,我的实现允许 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"));
}