Bjarne Stroustrup의 "A Tour of C ++"(제 2 판) 18 페이지에서 그는 "거의 모든 유형에 대해 초기화되지 않은 변수에서 읽거나 쓰는 효과는 정의되지 않았습니다"라고 말합니다.
초기화되지 않은 변수 에서 읽는 것이 정의되지 않은 동작 인 이유를 이해 하지만 초기화되지 않은 변수에 쓰는 것이 정의되지 않은 동작 인 이유는 무엇입니까? 정의되지 않은 동작을 트리거하지 않고 는 int x;
읽거나 쓸 수 없기 때문에 x
(즉,으로 아무것도 할 수 없기 때문에) 이와 같은 작업을 수행하는 것은 완전히 쓸모가 없기 때문입니다 x
(이가 int
적용되는 "거의 모든 유형"중 하나 라고 가정 ).
초기화되지 않은 변수에 쓰는 것은 괜찮습니다. 초기화되지 않은 변수로 정의되지 않은 동작을 얻을 수있는 유일한 경우는 변수에 어떤 것이 기록되기 전에 변수를 읽으려고 할 때입니다. 그러면 그 값이 정의되지 않았기 때문에 정의되지 않은 동작이 있습니다.
이제 정의되지 않은 동작은 수명이 시작되지 않은 객체에 쓰는 것입니다. 예를 들어 다음과 같은 구조체가있는 경우
struct foo
{
std::string str;
};
으로 당신은 그것을 위해 메모리를 확보 malloc
같은
foo* f = malloc(sizeof(foo));
그럼 당신은 할 수 없습니다
f->str = "some text";
그 이유는 malloc
실제로 당신에게 물건을주지 않기 때문 입니다. 그것이하는 일은 객체에 대한 저장소를 할당하는 것입니다. 이것은 의 생성자가 std::string
사소 하지 않다는 것을 의미하는 사소하지 않은 생성자를 가지고 있기 때문에 실제로 객체가 있다고 생각하기에 충분하지 않습니다 foo
. 의 수명 *f
을 시작하려면 foo
의 생성자 를 호출해야합니다 . 이를 위해 제공하는 메모리에서 객체를 구성하는 new 배치 를 사용 합니다. 마치
foo* f = malloc(sizeof(foo));
new(f) foo;
이것은 Bjarne이 이야기하려는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다