문제

나는 책을 읽었습니다. S. lippman "내부 C ++ 객체 모델"

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

그리고 "기본 생성자는이 코드 조각에 대해 합성되지 않았습니다.

글로벌 객체는 프로그램 시작시 관련 메모리가 "제로화"되어 있습니다. 프로그램 스택 및 프리 스토어에 할당 된 힙 객체에 할당 된 로컬 객체는 관련 메모리가 제로화되지 않습니다. 오히려 메모리는 이전 사용의 임의 비트 패턴을 유지합니다. "

이 코드에서 BAZ 객체는 힙에 생성되었으며 위에서 언급 한 내용에 따라이 객체는 전역이 아니며 기본 생성자라고합니다. 나는 올바르게 이해합니까?

도움이 되었습니까?

해결책

괄호 안에 new Foo() 지정하십시오 가치 초기화; 이는 기본적으로 각 멤버가 제로 시작되었음을 의미합니다. 대신 당신이 말한 경우 new Foo, 그러면 회원은 자동 변수와 마찬가지로 시작되지 않은 상태로 남겨 둘 것입니다.

불행히도, 자동 변수를 가치 가속화하기 위해서는 쓸 수 없습니다. Foo bar(), 그로 인해 함수가 선언되므로. 너는 필요할거야

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

다른 팁

당신이 이것을 할 때 :

Foo* baz = new Foo();

당신은 동적으로 할당하고 있습니다 Foo 인스턴스 및 가치 초기화 그것. 포드의 경우, 이는 멤버가 초기화되지 않은 것을 의미합니다. 당신이 이것을 말한 경우 (비 글로벌 컨텍스트를 가정) :

Foo* baz = new Foo;

그럼 Foo 인스턴스는 기본 초기화되므로 멤버의 초기화는 포드이기 때문에 수행되지 않습니다.

이것은 자동 저장 인스턴스에도 적용됩니다.

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

클래스에 기본 생성자가없고 다른 생성자가없는 경우 컴파일러는 귀하를 위해 하나를 생성합니다. 또는 수업의 인스턴스를 만들 수 없을 것입니다. 그러나 생성 된 기본 생성자는 아무것도하지 않습니다.

빈 괄호 세트를 추가하는 것 new Foo() 할당 된 객체를 초기화하는 값을 값으로 만드는 것입니다. 이는 멤버가 "기본"값으로 초기화되는 것을 의미합니다. nullptr 포인터를 위해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top