pop_back 함수가있는 클래스 템플릿 벡터가 의도 한대로 작동하지 않습니다.

asd
#include <iostream>
#include <vector>

using namespace std;

int main(){

   vector<int> VectorName;

   VectorName.push_back(2);
   VectorName.push_back(3);

   cout << VectorName[1] << endl;

   VectorName.pop_back();

   cout << VectorName[1] << endl;

}

내 이해에서 pop_back ()은 벡터의 마지막 인덱스를 팝한다고 가정하고 컴파일이 어떻게 될 것이라고 예상했는지는 오류를 발생시키는 것이 었습니다. 그러나 콘솔의 출력은 다음과 같이 명시되었습니다.

3 3

누군가가이 프로그램의 컴파일이 성공한 이유를 설명 할 수 있습니까?

감사합니다.

칼 니콜

vector<>::operator[]() 벡터의 크기를 확인하지 않으므로 코드가 정의되지 않은 동작을 생성합니다.

특정 경우에 벡터의 크기 (벡터의 항목 수)는 줄어들지 만 . 을 호출 할 때 용량 (기본 배열의 크기 )은 줄어들지 않습니다 pop_back(). 이것은 두 번째 VectorName[1]가 사용되지 않았지만 기존 메모리를 가리킴을 의미합니다 . 예를 들어 용량과 크기를 확인하기 위해 예제를 약간 편집하면 :

#include <iostream>
#include <vector>

using namespace std;

int main(){

    vector<int> VectorName;

    VectorName.push_back(2); // |[2]|
    VectorName.push_back(3); // |[2, 3]|

    VectorName.pop_back();   // |[2], 3|

    cout << VectorName.size() << endl;
    cout << VectorName.capacity() << endl;

}

출력은 다음과 같습니다.

1

2

여기에서 작동하는 예를 볼 수 있습니다. http://coliru.stacked-crooked.com/a/70d5141bdc375b48

보시다시피 벡터의 크기는 정확하지만 (1 개 항목)에 대한 호출 VectorName.pop_back()은 용량을 줄이지 않으므로 3벡터에 여전히 존재하지만 액세스 할 수 없습니다.

을 호출 한 후 두 번째 항목에 액세스하면 VectorName.pop_back()정의되지 않은 동작이 발생합니다. 귀하의 경우 3에는를 얻지 만 다른 컴파일러, 아키텍처 또는 기계를 사용하여 응용 프로그램을 컴파일하면 응용 프로그램이 충돌하거나 더 나빠질 수 있습니다!

사용 vector<int>::at()대신, vector<int>::operator[]()발생했을 std::out_of_range충돌로 프로그램을 일으키는 예외. 이는 at()함수가 벡터의 크기를 확인하고 벡터의 경계를 벗어난 위치에 액세스하려고하면 예외를 발생시키기 때문입니다. 즉, at()벡터 액세스를 확인하기 위해 함수에 의존하지 말고 size()를 호출하기 전에 벡터 를 확인하는 것이 VectorName[1]좋습니다.

예를 들어 코드를 다시 약간 수정하면 at()함수를 사용할 때 어떤 일이 발생하는지 확인할 수 있습니다 .

#include <iostream>
#include <vector>

using namespace std;

int main(){

    vector<int> VectorName;

    VectorName.push_back(2);
    VectorName.push_back(3);

    cout << VectorName.at(1) << endl;
    VectorName.pop_back();

    cout << VectorName.at(1) << endl;

    return 0;
}

'std :: out_of_range'의 인스턴스를 던진 후 종료가 호출됩니다.

what () : vector :: _ M_range_check : __n (1)> = this-> size () (1)

bash : 줄 7 : 4793 중단됨 (코어 덤프 됨) ./a.out

라이브 예 : http://coliru.stacked-crooked.com/a/8226be85196f54fe


"컴파일 오류"에 대한 추가 사항. 컴파일러는 사용자가 벡터에 액세스하기 전에 벡터의 크기를 확인하지 않으므로 컴파일러는 오류나 경고없이 코드를 즐겁게 컴파일합니다. 코드에 대한 경계 검사를 수행하는 것은 개발자에게 달려 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PHP 템플릿 클래스가 작동하지 않습니다.

분류에서Dev

템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

분류에서Dev

C ++ 클래스 함수가 다른 함수 내에서 의도 한대로 작동하지 않습니다.

분류에서Dev

push_back 및 insert가 내 벡터 클래스에서 제대로 작동하지 않습니다.

분류에서Dev

템플릿 클래스 정의 내의 템플릿 메서드가 선언과 일치하지 않습니다.

분류에서Dev

Django 템플릿 뷰 클래스가 작동하지 않습니다.

분류에서Dev

CSS : ID와 클래스가 의도 한대로 작동하지 않습니까?

분류에서Dev

CSS : ID와 클래스가 의도 한대로 작동하지 않습니까?

분류에서Dev

C ++의 템플릿 클래스에 대한 연산자 ostream 오버로딩이 작동하지 않습니다.

분류에서Dev

템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

분류에서Dev

템플릿 클래스가 서로의 인스턴스를 저장하지 않는 한 서로 의존 할 수 있습니까?

분류에서Dev

템플릿 템플릿을 사용하더라도 "클래스 템플릿을 사용하려면 템플릿 인수 목록이 필요합니다."오류가 발생하므로 템플릿 클래스가 필요합니다.

분류에서Dev

데이터가없는 AgGrid 사용자 정의 템플릿이 제대로 작동하지 않습니다.

분류에서Dev

부트 스트랩 클래스가 계속 작동하도록 하나의 각도 템플릿을 다른 템플릿에 어떻게 포함합니까?

분류에서Dev

템플릿 선형 대수 벡터 클래스의 이상한 "멤버 함수가 실행 불가능"오류

분류에서Dev

Django의 클래스에서 템플릿에 콘텐츠를로드하는 데 문제가 있습니다.

분류에서Dev

webpack 템플릿 조건부`클래스 이름`이있는 Reactjs가 작동하지 않습니다.

분류에서Dev

하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

분류에서Dev

하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

분류에서Dev

클래스에 정의 된 것보다 많은 템플릿 값을 가진 연산자에 대해 일치하는 함수가 없습니다.

분류에서Dev

오류 : 매개 변수 팩 클래스 템플릿의 클래스 템플릿에 대한 인수가 너무 많습니다.

분류에서Dev

참조가있는 클래스 템플릿에 대한 이동 의미 체계를 지원하는 방법

분류에서Dev

Django 템플릿의 Count 메서드가 예상대로 작동하지 않습니다.

분류에서Dev

내 클래스의 정적 인스턴스 함수가 예상대로 작동하지 않습니다.

분류에서Dev

Typescript의 클래스가 함수로 작동하도록 할 수 있습니까?

분류에서Dev

템플릿 인수가 다른 동일한 클래스는 서로의 개인 필드에 액세스 할 수 없습니다.

분류에서Dev

새 클래스 내의 KerasClassifier가 제대로 작동하지 않습니다.

분류에서Dev

decltype ()이 컴파일되는 클래스 템플릿에 대해 작동하지 않습니다.

분류에서Dev

동일한 클래스를 가진 두 개의 Jquery Datatable이 제대로 작동하지 않습니다.

Related 관련 기사

  1. 1

    PHP 템플릿 클래스가 작동하지 않습니다.

  2. 2

    템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

  3. 3

    C ++ 클래스 함수가 다른 함수 내에서 의도 한대로 작동하지 않습니다.

  4. 4

    push_back 및 insert가 내 벡터 클래스에서 제대로 작동하지 않습니다.

  5. 5

    템플릿 클래스 정의 내의 템플릿 메서드가 선언과 일치하지 않습니다.

  6. 6

    Django 템플릿 뷰 클래스가 작동하지 않습니다.

  7. 7

    CSS : ID와 클래스가 의도 한대로 작동하지 않습니까?

  8. 8

    CSS : ID와 클래스가 의도 한대로 작동하지 않습니까?

  9. 9

    C ++의 템플릿 클래스에 대한 연산자 ostream 오버로딩이 작동하지 않습니다.

  10. 10

    템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

  11. 11

    템플릿 클래스가 서로의 인스턴스를 저장하지 않는 한 서로 의존 할 수 있습니까?

  12. 12

    템플릿 템플릿을 사용하더라도 "클래스 템플릿을 사용하려면 템플릿 인수 목록이 필요합니다."오류가 발생하므로 템플릿 클래스가 필요합니다.

  13. 13

    데이터가없는 AgGrid 사용자 정의 템플릿이 제대로 작동하지 않습니다.

  14. 14

    부트 스트랩 클래스가 계속 작동하도록 하나의 각도 템플릿을 다른 템플릿에 어떻게 포함합니까?

  15. 15

    템플릿 선형 대수 벡터 클래스의 이상한 "멤버 함수가 실행 불가능"오류

  16. 16

    Django의 클래스에서 템플릿에 콘텐츠를로드하는 데 문제가 있습니다.

  17. 17

    webpack 템플릿 조건부`클래스 이름`이있는 Reactjs가 작동하지 않습니다.

  18. 18

    하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

  19. 19

    하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

  20. 20

    클래스에 정의 된 것보다 많은 템플릿 값을 가진 연산자에 대해 일치하는 함수가 없습니다.

  21. 21

    오류 : 매개 변수 팩 클래스 템플릿의 클래스 템플릿에 대한 인수가 너무 많습니다.

  22. 22

    참조가있는 클래스 템플릿에 대한 이동 의미 체계를 지원하는 방법

  23. 23

    Django 템플릿의 Count 메서드가 예상대로 작동하지 않습니다.

  24. 24

    내 클래스의 정적 인스턴스 함수가 예상대로 작동하지 않습니다.

  25. 25

    Typescript의 클래스가 함수로 작동하도록 할 수 있습니까?

  26. 26

    템플릿 인수가 다른 동일한 클래스는 서로의 개인 필드에 액세스 할 수 없습니다.

  27. 27

    새 클래스 내의 KerasClassifier가 제대로 작동하지 않습니다.

  28. 28

    decltype ()이 컴파일되는 클래스 템플릿에 대해 작동하지 않습니다.

  29. 29

    동일한 클래스를 가진 두 개의 Jquery Datatable이 제대로 작동하지 않습니다.

뜨겁다태그

보관