티스토리 뷰

728x90

1. 포인터 연산이란?

 

포인터 타입을 제공하는 언어는 보통 두가지의 기본적인 포인터 연산역참조를 제공한다다.


  첫 번째 포인터 연산은 포인터 변수의 값을 유용한 주소로 설정한다. 포인터 변수가 단지 동적 기억장소를 관리하는데 사용되면, 연산자나 내장 부 프로그램에 의한 할당으로 포인터 변수를 초기화 하는 역할을 한다. 즉 표현식에 포함된 포인터 변수는 바인딩되어 있는 메모리 셀의 내용에 대한 참조로서 해석될 수 있다. 


  두 번째 역참조는 변수에 대한 간접 주소 지정을 위해서 사용된다. 포인터 변수에 바인딩된 메모리 셀이 가리키는 메모리 셀의 내용에 대한 참조이다. 즉 역참조는 간접참조라고 할 수 있다. 포인터의 여감조는 명시적이거나 묵시적일 수 있다. Fortran 95에서 역참조는 묵시적이였으나, 오늘날의 많은 언어에서는 역참조를 명시적으로 명세될 때만 발생한다. C언어나 C++에서 역참조는 *(별표)를 이용하여 명시적으로 명세한다.


     j = *ptr

 

 

2. 포인터의 문제

 

  포인터 변수를 포함한 첫 번째 프로그래밍 언어는 PL/I이다. 이 언어에서 포인터는 힙-동적 변수뿐만 아니라 다른 프로그램 변수도 참조하는 데 사용될 수 있다. PL/I의 포인터는 유연성이 높지만, 이러한 포인터의 사용은 여러 가지 유형의 프로그래밍 오류를 초래할 수 있다. 이러한 오류를 최소화하기 위해 Java와 같은 최근 언어들은 참조 타입과 묵시적 기억장소 회수를 통해 포인터를 대체하였다. 여기서 참조타입은 포인터와 유사하나, 근본적으로 다른 변수이다. 포인터는 메모리의 주소를 참조하는 것에 반해, 참조 변수는 객체나 메모리의 값을 참조한다.

 

1. 허상포인터 

   허상 포인터 또는 허상 참조는 이미 회수된 힙-동적 변수의 주소를 포함하고 있는 포인터이다. 허상 포인터는 영역이 해제되었다가 다른 자료형 변수에 의해 해당 영역이 할당되었을 때 허상 포인터가 접근하면 큰 문제점을 발생 시킨다.

 

     int * arrayPrt1;

     int * arrayPrt2 = new int[100];

     arrayPrt1 = arrayPrt2;

     delete[] = arrayPrt2;

  //여기에서 arrayPrt1은 허상포인터이다. 이 포인터가 가리키고 있는 힙 기억공간이 반환되었기 때문이다.

 

2. 분실된 힙-동적 변수

  분실된 힙-동적 변수는 사용자 프로그램에서 더이상 접근될 수 없는 할당된 힙-동적 변수이다. 이때 할당된 영역(변수)을 garbage(쓰레기)라고 하는데 이는 해당 영역이 원래의 목적으로 사용될 수 없고, 프로그램에서 새로운 용도로 다시 할당될 수도 없기 때문이다. 

 

     int * arrayPrt = new int[100];

     arrayPrt = new int[100];

  //처음 할당된 영역은 더 이상 접근할 수 없고 새로 할당될 수도 없기 때문에 garbage이다.

 

 

 

3. 언어별 포인터

 

1. Ada의 포인터  

  Ada의 포인터는 access 타입이라 불린다. 허상 포인터 문제는 Ada 설계에서 많이 줄였다. 힙-동적 변수는 그 포인터 타입의 영역이 끝나는 지점에서 묵시적으로 회수될 수 있으며, 따라서 명시적으로 회수의 필요성이 현격하게 감소된다. 그러나 Unchecked_Deallocation이라는 명시적으로 영역을 회수할 수 있는 함수를 제공함으로 잠재적으로 허상 포인터를 초래 할 수 있다. 분실된 힙-동적 변수 문제는 Ada의 포인터 설계에서 제거되지 않았다.

 

2. C와 C++의 포인터

   C와 C++에서의 포인터는 주소가 어셈블리 언어에서 사용되는 것과 동일한 방식으로 사용될 수 있다. 이는 포인터가 상당한 유연성을 제공하지만 상당히 조심스럽게 사용해야 한다는 것을 말한다. 또한 이러한 설계는 허상 포인터나 분실된 힙-동적 변수 문제에 대해서 어떠한 해결책도 제공하지 않는다는 뜻이다.

 

 

3. Pascal의 포인터  

   Pascal은 명시적 기억장소 회수 연산자 dispose를 가지고 있다. dispose 함수를 사용함으로 야기되는 허상 포인터 문제 때문에, 어떤 Pascal 구현은 dispose 함수가 프로그램에 나타날 때, 단순히 그것을 무시한다. 이 방식은 허상 참조를 효과적으로 방지하지만, 프로그램이 더이상 필요로 하지 않는 힙 기억공간을 재사용하는 것을 막는다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함