2016-07-04 9 views
0

어떤 이유로 든 내 구현으로 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 
+1

같은 것이 ... "내 관점에 대해 나에게 분할 오류 오류가 발생합니다 모두 위치가" 다시 코드가 부족합니다. 따라서 * 정의되지 않은 동작 *을 호출하는 특성. – WhozCraig

+0

'길이'와 '뚜껑'의 차이점은 무엇입니까? –

답변

4

표준은 그것이 정의되지 않은 동작 말한다 아닌 세그먼트 오류.

이것은 단지 (arr + 50)이 프로그램 용으로 예약 된 메모리 위치이기 때문에 효과가 있습니다.

또한 위치가 항상 존재한다는 것을 기억하십시오 (RAM의 마지막 바이트가 아닌 경우). 실제 수준에서 이들은 단지 비트이므로 항상 거기에 뭔가가 있습니다.

예를 들어 v [12345678]에 액세스하려고하면 세그먼트 화 오류가 발생할 수 있습니다.

어쨌든 의 정의되지 않은 동작이므로 NEVER은 이러한 영향을받습니다.

+0

제한을 확인하고 예외를 throw해야합니까? – warwcat

+0

네, 좋은 접근 방법입니다. –

+2

@warwcat'std :: vector'는 인덱스 액세스를위한 두 가지 메소드 인'std :: vector :: at'와'std :: vector :: operator []'를 제공하며, 전자는 바운드 검사를 사용하고' std :: out_of_range'는 인덱스가 범위를 벗어난 반면 후자는 바인딩 된 체크를하지 않습니다 (UB가 인덱스를 벗어나는 경우) - 이것이 STL 컨테이너의 전형적인 접근 방법입니다. – ArchbishopOfBanterbury

0

함수의 매개 변수를 확인하지 않았습니다. '당신의 관점 * 행동 *의 정의를 수행 할 것 같습니다 것을 원 -

당신이 일을해야하는 것은

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