2010-12-11 4 views
0

특정 함수의 인수로 값을 전달하면 해당 함수는 함수 실행이 종료되면이 매개 변수의 메모리를 할당 해제합니다.스택 메모리 할당 및 할당 해제 메커니즘

인수로 포인터 또는 참조를 전달하면 함수가 포인터 인수의 메모리를 할당 취소하면 어떻게됩니까? 그것은 함수 밖의 변수에 영향을 미칠 것입니까?

답변

0

첫 번째 경우 메모리는 "할당 취소"됩니다 (실제로 스택 포인터가 증가합니다). 이것이 POD 유형이 아니면 변수 소멸자가 호출되므로 할당 된 경우 메모리가 힙에서 할당 해제됩니다.

두 번째 경우 포인터에 의해 참조되는 값은 할당 취소되지 않습니다. 포인터 용 메모리 만 할당 해제됩니다.

0

포인트 1의 경우, 인수의 유형에 따라 다릅니다. 예 : 합격 값에 의한 '문자열'은 암시 적 복사를 수행하고, 변수 (함수 매개 변수)가 범위를 벗어나면 사본이 사용하는 메모리는 할당 해제됩니다. 이것은 자신의 유형에 따라 자동으로 발생하지는 않습니다 - 건설과 파괴를 올바르게 설정해야합니다.

두 번째로, 포인터를 사용하여 할당을 해제하면 함수 내부와 외부 모두에서 주소 지정 메모리에 영향을 미칩니다. - FUNC에 대한 호출이 BAD 후 myArray를 사용

void func(char *someMemory) { 
    delete[] someMemory; 
} 

//... 
char *myArray = new char[100]; 
func(myArray); 

이 ... 할당 된 메모리를 삭제합니다 :

는 두 번째 점을 명확히하기 위해.

+0

내 형식의 경우에도 항상 암시 적 복사본 생성자가 있습니다. 특정 의미론이 필요하지 않으면 '문자열'과 같은 방식으로 자동으로 관리됩니다. –

+0

@Roberto : 메모리를 할당하는 유형에 대해 이야기하고 있습니다. 나는 '반드시 _ 자동적으로 _ 일어나지 않을 것'이라고 말했어야합니다. :) – sje397

0

당신이 값 또는 그 값을 유지하는 데 필요한 메모리가 스택에 할당 된 스택에 대한 포인터를 전달하면 ...

스택은 당신이 "할당"더 많은 메모리를 유지할 수 있습니다 작동하는 방식하지만, 역순으로 "해제"되어야합니다.

은 그래서 : 당신은 F() PTR 및 V의 값이 스택에 "밀어"하는 호출하면

void f(int *ptr, int v) 
{ 
// Do something 
} 

, 즉 충분한 메모리가 마술이 값을 저장하기 위해 만든됩니다. 함수가 스택을 반환하면 스택에서 "팝"된 의미로 다른 방식으로 스택이 조정됩니다.

이 푸시 및 팝핑은 원래 포인터 나 값에 영향을 미치지 않습니다. 그래서 :

ptr++; 

하지 효과 호출 기능에 의해 개최 포인터의 값입니다.

역 참조하면 * ptr, 함수 외부에서 볼 수있는 동일한 데이터에 액세스하는 포인터. 포인터를 놓으면() 포인터가 함수 외부에서 보이는 것과 충돌합니다. 따라서 포인터를 전달하면 포인터가 가리키는 원본 데이터로 만들어진 복사본이 없지만 실제 포인터로 만들어진 복사본이 있습니다. 포인터는 값에 의해 전달됩니다.