문제

C ++의 맥락에서 (중요하지 않음) :

class Foo{
    private:
        int x[100];
    public:
        Foo();
}

내가 배운 것은 당신이 Foo의 인스턴스를 만들면 :

Foo bar = new Foo();

그런 다음 배열 X가 힙에 할당되지만 Foo 인스턴스를 만들면 다음과 같습니다.

Foo bar;

그런 다음 스택에서 생성됩니다.

이를 확인하기 위해 온라인으로 리소스를 찾을 수 없습니다.

도움이 되었습니까?

해결책

예제의 약간 수정이 주어졌습니다.

class Foo{
    private:
        int x[100];
        int *y;
    public:
        Foo()
        {
           y = new int[100];
        }
        ~Foo()
        { 
           delete[] y; 
        }

}

Example 1:

Foo *bar = new Foo();
  • x와 y는 힙에 있습니다.
  • sizeof (foo*)는 스택에서 생성됩니다.
  • 크기 (int) * 100 * 2 + sizeof (int *)는 힙에 있습니다.

Example 2:

Foo bar;
  • X는 스택에 있고 y는 힙에 있습니다.
  • Sizeof (int) * 100은 스택 (x) + sizeof (int *)에 있습니다.
  • 크기 (int) * 100은 힙에 있습니다 (y)

컴파일러 및 플랫폼에 따라 클래스/구조물 정렬로 인해 실제 크기가 약간 다를 수 있습니다.

다른 팁

엄격하게 말하면, 표준에 따라 스택이나 힙에 객체가 존재할 필요가 없습니다. 표준은 3 가지 유형의 '스토리지 지속 시간'을 정의하지만 스토리지 구현 방법을 정확하게 언급하지는 않습니다.

  1. 정적 저장 시간
  2. 자동 저장 시간
  3. 동적 스토리지 지속 시간

자동 저장 시간은 일반적으로 스택을 사용하여 (거의 항상) 구현됩니다.

동적 스토리지 지속 시간은 일반적으로 힙을 사용하여 구현됩니다 (궁극적으로 malloc()), 이것은 컴파일러의 사용자에 의해서도 재정의 될 수 있습니다.

정적 저장 시간은 일반적으로 글로벌 (또는 정적 저장)으로 알려진 것입니다.

표준은 이것에 대해 말할 수 있습니다 (다음은 발췌 한 내용이 3.7- 스토리지 지속 시간의 다양한 비트를 형성합니다) :

정적 및 자동 저장 기간은 선언 (3.1)에 의해 도입되고 구현에 의해 암시 적으로 생성 된 개체와 관련이 있습니다 (12.2). 동적 저장 시간은 연산자 새 (5.3.4)와 함께 생성 된 객체와 관련이 있습니다.

...

동적 저장 시간이 없거나 로컬에있는 모든 객체는 정적 저장 시간을 갖습니다. 이 객체의 저장소는 프로그램 기간 동안 지속됩니다 (3.6.2, 3.6.3).

...

로컬 객체는 자동으로 선언하거나 등록하거나 명시 적으로 선언하지 않거나 정적으로 선언하지 않거나 외부에 자동 저장 시간이 있습니다. 이 객체의 저장은 출구가 생성 된 블록까지 지속됩니다.

...

객체는 프로그램 실행 (1.9), 새로운 표현 (5.3.4)을 사용하여 동적으로 생성 될 수 있으며 삭제 표현 (5.3.5)을 사용하여 파괴 될 수 있습니다. AC + + 구현은 글로벌 할당 함수 운영자 새로운 및 운영자를 통한 동적 스토리지에 대한 액세스 및 관리를 제공합니다. 신규 [] 및 글로벌 거래 기능 운영자 삭제 및 운영자 삭제 [].

...

라이브러리는 글로벌 할당 및 거래 기능에 대한 기본 정의를 제공합니다. 일부 글로벌 할당 및 거래 기능은 교체 가능합니다 (18.4.1)

그리고 마지막으로 (예제 클래스의 배열과 관련하여) :

3.7.4 하위 객체의 지속 시간 [Basic.stc.inherit

멤버 서브 밥, 기본 클래스 하위 객체 및 배열 요소의 저장 시간은 완전한 객체 (1.8)입니다.

FOO 형 객체는 순서대로 저장된 100 개의 int 크기를 취합니다. 스택에서 그것을 만들면 스택에서 모든 것을 얻게됩니다. 새로 사용하면 물체의 일부로 힙에 올 것입니다.

이것은 언어 사양의 일부입니다. 귀하의 질문이 무엇인지 잘 모르겠습니다.

예, 멤버 배열 x 당신이 만들면 힙에 생성됩니다. Foo 힙에 물체. 동적 메모리를 할당 할 때 Foo 당신은 길이의 기억을 요구하고 있습니다 sizeof(Foo) (아마도 메모리 오버 헤드가있을 가능성이 있지만 시간을 무시합시다), 샘플 코드에서 크기가 100이라는 것을 암시합니다. int에스. 이것 가지다 유형 대상의 수명에 대한 경우 Foo (그리고 그들의 내부 데이터) 스코프를 교차합니다.

당신이 만들지 않는다면 Foo 힙의 물체 및 내부 배열 Foo 메모리를 할당하는 포인터가 아닙니다 new 안에 Foo그러면 내부 배열이 스택에서 생성됩니다. 다시, 이것은 배열을 자동으로 청소하기 위해서는 그렇습니다. deletes 범위가 끝나면 s. 구체적으로,

struct Foo {
    int* y;
    Foo() : y(new int()) { }
    ~Foo() { delete y; }
};

만들 것입니다 y a Foo 객체는 스택이나 더미에 생성되었습니다.

네 말 뜻은

Foo* bar = new Foo(); 

나는 생각한다. 저것 힙에 생성됩니다.

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