너무 논란의 여지가없는 질문이지만, 적절한 답변을 찾지 못했습니다. 이것은 또한 reserve
과 resize
의 차이점이나 capacity
과 size
의 차이점에 대한 질문이 아니며, 나에게도 잘 알려져 있으며 자주 묻는 질문이 많습니다. 또한 이것은 좋은 습관이라면 질문이 아닙니다. 그렇지 않은 것이 좋습니다!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++의 컴파일을 지원하는 모든 플랫폼에서 작동하겠습니까?
정의되지 않은 동작은 정의되지 않습니다. – tkausl
바운드 아웃은 정의되지 않은 동작입니다. 이야기의 끝. –
세그멘테이션 오류가 발생하거나 쉘의 권한 약화를 악용하여 하드 드라이브를 포맷하거나 밤에 일어나서 담요 아래에 거북이를 넣을 수 있습니다. UB의 기쁨도 마찬가지입니다. 일어나거나 일어나지 않는 것에 의지 할 수 없습니다. – DevSolar