2017-11-22 2 views
0

너무 논란의 여지가없는 질문이지만, 적절한 답변을 찾지 못했습니다. 이것은 또한 reserveresize의 차이점이나 capacitysize의 차이점에 대한 질문이 아니며, 나에게도 잘 알려져 있으며 자주 묻는 질문이 많습니다. 또한 이것은 좋은 습관이라면 질문이 아닙니다. 그렇지 않은 것이 좋습니다!std :: vector의 예약 된 공간에 쓰면 세그먼트 화 오류가 발생할 수 있습니까?

는 다음과 같은 상황을 고려 :

#include <vector> 
#include <iostream> 

struct Foo 
{ 
    double a, b; 
}; 

int main(int argc, char* argv[]) 
{ 
    std::vector<Foo> Vec; 
    Vec.reserve(100); 

    Foo foo; 
    foo.a = -13.131; 
    foo.b = 3.141; 

    for(int i = 0; i < 100; ++i) 
    Vec[i] = foo; 

    for(int i = 0; i < 100; ++i) 
    std::cout << Vec[i].a << std::endl; 

    return 0; 
} 

내가 먼저 푸와 예비 메모리의 std::vector를 작성,하지만 벡터의 크기를 조정하지 않습니다. 분명히 size() = 0이지만, 100 개 요소에 대한 메모리가 할당되었고 이제는 내 프로그램에서 자유롭게 사용할 수 있습니다. 따라서 기술적으로이 요소의 메모리에 쓰거나 읽으면 세그먼테이션 오류가 발생하지 않을 수 있습니다. 맞습니까?

우분투 14.04에서이 코드를 실행하려고했는데 예상대로 모든 것이 작동합니다. 벡터 크기가 0 인 상태에서도 모든 100 개의 요소가 성공적으로 작성되었으며 모든 출력도 -13.131입니다. 그래서 그들은 요소가 초기화되지 않았기 때문에 결과가 정의되지 않은 동작을 일으킨다는 사실을 지적했다. 그러나 실제로는 어떤 방법 으로든 세그멘테이션 오류가 발생할 수있다. (벡터에서 단위 화 된 포인터의 요소에 액세스하는 것에 대해 이야기하지 않는다.)?

here 질문과 비슷한 질문을 받았지만 내 생각을 확신하는 것처럼 보이지만 원칙적으로 C++의 컴파일을 지원하는 모든 플랫폼에서 작동하겠습니까?

+18

정의되지 않은 동작은 정의되지 않습니다. – tkausl

+6

바운드 아웃은 정의되지 않은 동작입니다. 이야기의 끝. –

+0

세그멘테이션 오류가 발생하거나 쉘의 권한 약화를 악용하여 하드 드라이브를 포맷하거나 밤에 일어나서 담요 아래에 거북이를 넣을 수 있습니다. UB의 기쁨도 마찬가지입니다. 일어나거나 일어나지 않는 것에 의지 할 수 없습니다. – DevSolar

답변

3

정의되지 않은 동작이 발생하면 잘 정의되지 않은 동작입니다. 정의되지 않은 동작의 주요 측면 중 하나는 다른 시스템 및 컴파일러에서 동작이 무엇인지 확신 할 수 없다는 것입니다. 이제 특정 컴파일러와 특정 라이브러리 구현의 코드를 살펴볼 수 있으며 예상대로 작동합니다.

그러나 나는 이것이 다른 시스템, 컴파일러 및 라이브러리 구현에서 모두 작동 할 것이라는 것을 기꺼이 알 수있는 사람을 찾지 못할 것이라고 생각합니다.

예를 들어, 특정 벡터 구현이 내부 정보 용으로 예약 된 메모리를 사용하기로 결정하면 어떻게됩니까? 어쩌면 그렇게 할 수는 없겠지만 시스템이 실제로 어떤 시스템을 수행하고 있는지 확신 할 수 없습니까? 이 메모리를 할당하지만 백그라운드 스레드에서 복사를 수행하기 시작, 예비()가 호출 될 때 그 표준 : : 벡터 구현 - -

0

우리가 구체적인 예를 살펴 보자 어깨를 으쓱 ... 그것은 수 있기 때문에 가까운 장래에 어떤 일이 일어날 지 누가 알겠습니까! 따라서 복사하는 동안 모든 읽기는 잠금 해제되고 오래된 메모리 영역으로 곧바로 이동합니다. 그래도 읽기에는 여전히 유용하기 때문입니다.

이제 범위를 벗어난 값을 읽으려고하면 임의의 메모리를 읽으려고 시도하고 사용자가 할당 한 새로운 메모리가되어야한다고 주장하지 않습니다.

의견과 다른 답변에서 말하듯이 undefined는 정의되지 않습니다.