2012-11-29 2 views
3

에 :클래스 개인 데이터 - 다음 코드에서 스택 또는 힙

class Array { 
    public: 
     int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; } 
    private: 
     int data[100]; 
}; 

int main() 
{ 
    Array a; 
    a[10] = 42; 
    a[12] += a[13]; 
    ... 
} 

새가를 할당하는 데 사용되지 이후 스택 타입의 배열은 변수를 (내가 틀렸다면 수정) . Array 클래스에는 int data [100]가 있으며 연산자 오버로드는 데이터의 특정 인덱스에 대한 참조를 반환합니다.

question을 참조하십시오.

제 질문은 int 데이터 [100]이 (가) 스택 또는 힙에 있는지 여부입니다. 나는 그것이 스택이 아니어야한다고 생각한다. 그렇지 않다면 위와 같은 레퍼런스 리턴이 어떻게 작동 할 수 있을까?

감사합니다. 당신이 a을 언급 한대로 스택에 할당 된 이후

답변

2

그것은 스택에 있습니다.

스택은 힙과 마찬가지로 메모리입니다. 힙에 할당 된 메모리와 마찬가지로 그 부분에 대한 참조를 반환 할 수 있습니다. 유일한 차이점은 메모리 관리 방법에 있습니다.

주의해야 할 점은 할당이 해제 된 메모리에 액세스하지 않는 것입니다. 스택의 경우에는 a의 범위 끝에서 발생하며 힙 할당 데이터는 명시 적으로 삭제해야합니다. 당신은 스택에 선언 된 변수에 대한 참조 함수에서 반환을 참조 질문에

; 이 경우 함수가 종료 될 때 변수가 파괴되므로 코드가 잘못됩니다. 귀하의 경우에는 개체의 수명과 일치하는 data의 부분에 대한 참조가 반환됩니다. 따라서 a이 삭제되지 않은 한이 방법으로 데이터에 액세스하는 것이 안전합니다.

0

스택에 있습니다. 참조 회수가 왜 문제가됩니까? 문제없이 스택에있는 항목에 대한 참조를 만들고 사용할 수 있습니다.

void foo(void) 
{ 
int i; 
int& j = i; // reference to variable on the stack 
j = 2; 
} 

여기에 어떤 문제가 있다고 생각합니까?

0

스택에 있습니다. "a"가 범위를 벗어난 후 해당 참조를 사용하려고하면 정의되지 않은 동작이 발생합니다. 잘하면 곧 추락 할 것입니다.

0

내 질문은 int 데이터 [100] 스택 또는 힙에 있는지 여부입니까? 나는 그것이 스택이 아니어야한다고 생각한다. 그렇지 않다면 위와 같은 레퍼런스 리턴이 어떻게 작동 할 수 있을까?

자동 저장 기간, 즉 스택이 아니라 힙이 할당됩니다. 동적으로 할당하지 않았으므로 동적 (힙) 할당이 발생하지 않습니다. 그것을 허용하는 것은 끔찍한 일이며, C++은 사용하지 않는 것을 지불하지 않는 것에 관한 것입니다.

data 즉 그 범위 선언, Array 인스턴스의 영역을 떠난 경우 자체가 무효가되므로 data 또는 data 행의 요소에 대한 참조. 이제 Array 유형에서 동적 할당을 사용해야합니까? 거의 확실합니다. 예, 일반용 컨테이너입니다. 참조 또는 불량 데이터에 대한 포인터를 보관하지 않는 것은 사용자의 책임입니다.

0

"귀하는"배열 유형의 변수 a가 스택에 있습니다 "라고 말합니다.기술적으로 개체이라는 이름의 a이 스택에 있습니다. 이는 객체 a의 모든 멤버 변수가 스택에 있음을 의미합니다.

즉, 구성원 배열 data의 요소에 대한 참조를 반환하는 것은 매우 위험합니다. 컴파일러에서 허용하지만 변수 a이 범위를 벗어 났을 때이 참조에 액세스하려고하면 정의되지 않은 동작이 발생합니다.

예를 들어, operator[]()에 대한 모든 호출은 동일한 메소드 내에 있으므로 모든 것이 정상입니다.

+1

기술적으로 a라는 객체는 자동 저장 기간과 관련됩니다. 언어는 이러한 종류의 스토리지를 구현하기위한 스택 구조를 필요로하지 않습니다. 그냥 "기술": D –

+0

@EdS. 설명을 주셔서 감사합니다 ;-) –