2014-11-16 2 views
1

초등의 선을 따라 가기 쉽기 때문에이 질문을 용서하십시오. 또한, 광범위하게 봤어,하지만 내가 발견 한 모든 예제는 메모리 누수가 아주 분명 결과 구현을 사용했다. 다음 의사 코드의C++ 함수의 포인터 범위/파기

를 적어 둡니다 : 내가 함수 본문에 선언 된 부모 클래스, 내가 포인터를 의미하는 "부모", meam하지 않는 파괴함으로써

void myArbitraryFunc(){ 
... 
// Create Pointer to parent class 
MyParentClass* parent = (MyParentClass*)this.getParent(); 
parent->doSomething(someData); 
... 
}// Is parent destroyed here? 

. 그것이 범위를 벗어나면 파괴됩니다, 맞습니까? 그렇다면 왜? 원래 부모와 연결되지 않은 상태에서 클래스 포인터의 복제본을 만드는 방법은 무엇입니까?

+0

'parent'포인터가 삭제되었습니다. 동일한 이유 때문에'int'와 같은 지역 변수는 모두 파괴됩니다. 계속 유지하려면 반원에게 그것을 저장하거나 반납하십시오. –

+0

@Neeil Kirk는 int와 같은 것임을 명확히 해 주셔서 감사합니다. 그러나 포인터를 반환하여 부모 클래스에 대한 액세스를 전달하지 않습니까? Doppleganger/관련이없는 복제본을 전달하고 싶다면 어떻게해야합니까? – Krythic

+0

예. 원본 개체의 복사본을 반환 하시겠습니까? –

답변

3

포인터 parent이 파괴되었습니다. 그러나 그것이 가리키는 것은 이 아니고이 파괴 된 것입니다.

포인터 자체는 스택의 변수 일 뿐이며 현재 범위가 끝날 때 스택이 unwind 될 때 사라집니다. 그것은 개념적으로이 코드 다르지 않다 :

void myArbitraryFunc() { 
    ... 
    int parent = 42; 
    .... 
} // parent goes away 

그것에 대해 생각하는 방법은 포인터가 단지 수 있다는 것이다, 객체의 메모리 주소 인 그 숫자는 지적했다.

예를 들어 MyParentClass 객체 자체가 다른 것으로 생성되었으며 다른 것으로 소유하고있는 것으로 가정하므로 myArbitraryFunc은 삭제할 책임이 없습니다.

포인터는 실제로는 숫자이며 개체의 "주소"입니다. 메모리를 거대한 상자 세트로 숫자와 함께 상상해보십시오. 시스템에 객체 생성을 요청하면 객체가 상자 42에 있음을 알 수 있습니다. '42'사본을 작성하는 것은 객체 자체에 아무 것도하지 않습니다. 그것은 주소의 사본을 많이 만들고 있습니다.

+0

위와 같이 게시 한 것처럼 : "그러나 포인터를 반환하면 부모 클래스에 대한 액세스가 전달되지 않겠습니까? 그냥 doppleganger/관련이없는 중복을 전달하고 싶습니다." – Krythic

+0

포인터는 숫자입니다. 라벨로 생각하십시오. 'getParent'는 객체를 반환하지 않습니다. 객체를 찾을 수있는 숫자가 반환됩니다. –

+0

그 점을 이해 합니다만, 응용 프로그램 파이프 라인에서 더 아래쪽의 첫 번째 포인터 클래스에 대한 액세스 권한을 부여하지 않고 함수가 호출 된 시간에 해당 객체가 갖고 있던 것만 큼 중복 된 (관련없는 포인터)를 만들고 싶다고 가정합니다. – Krythic