달력

05

« 2018/05 »

  •  
  •  
  • 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
  • 31
  •  
  •  




이번 항목부터 리소스 누수, 예외처리에 대한 이야기가 펼쳐진다.
와~ 신난다.

본론으로 바로 들어가자.

1. 데이터를 받아서, 기록하려 한다.

2. 데이터를 파일에 저장되어 있다.

3. 파일안에는

"개"
"고양이"
"코끼리"
...

여러 동물들에 대한 이름과 정보가 들어가 있다.

다음과 같은 상황에서 DB를 구축한다고 하였을 때,

AAA라는 추상 클래스를 생성 -> ex) "동물"

AAA를 상속받은 BBB 클래스 -> ex) "개"
AAA를 상속받은 CCC 클래스 -> ex) "코끼리"
AAA를 상속받은 DDD 클래스 -> ex) "고양이"

라고 한다면,

다음 클래스가 대충 이해가 갈 것이다.


복잡하려나--; 가능한 쉽게 한다고 하는데..
뭐, 정 복잡하면.

이 부분만 봐도 된다.

readAAA 안에서는 새로운 객체를 생성하여
return AAA* 를 하게 되는데,
만약.

이 부분에 예외가 발생하면 어떻게 될까?
delete 부분은 수행되지 않을 것이고.
메모리 누수가 발생할 것이다.

그래서 예지력이 뛰어난 우리는 누수를 막기 위해,
다음과 같은 예외처리를 삽입하였다.

아 정말 뛰어난 예외처리다. 이제 문제가 발생해도,
메모리 누수가 일어 나지 않을꺼야.
라고 좋아 하고 있는데,
뭔가 이상하다.
만약 pa의 이름이 바뀌어서.
pa2가 되었다면.
catch안에 있는 pa도...
밖에 있는 pa도, ps2로 바꿔주는 귀찮음이 생길 수 있고.
delete pa 를 2번 쓴다는것 자체가 뭔가 무의미 하고 복잡하게 느껴진다.

라고 생각이 든다고 한다.(진짜?)
즉, 수정하고 나니 뭔가 잘못된 것 아니야? 라고 느낀다는 것이다.

쉽게 말해, 예외가 발생하든, 발생하지 않든.
pa는 삭제 되어야 한다는 것이고
구지 2번 쓸 필요 없이 다른 방법을 찾아 보자. 라는것이다.

먼저 그 해결책에 대해서 2가지 방법을 제시 하고 있는데,

그 첫번째. 스마트 포인터.

자세한 내용은 후에 항목에서 소개가 될테니 넘어가고.

쉽게 이야기 하면,
자신의 유효범위를 벗어나면 자신이 가리키고 있는 메모리를 삭제 할 수 있는 "포인터처럼 동작하는 객체"라고 한다.

일단 c++ 라이브러리에는 auto_ptr 이라는 "그런 일"을 하는 객체가 이미 정의되어 있다고 한다.
대충 개념만 따지면 다음처럼 말이다.

"보고 있나 플머?"
뭐 여튼, 포인터 같이 활동하는 객체 라는것을 주의하면서
생성자, 소멸자를 통해 메모리 누수를 막고 있다는 것을 파악하면 된다.

책에서는 "사실, 단순 데이터를 보관하는거면 그냥 stl의 vector를 쓰세요."
라고도 말 하고 있지만....;;
일단! 다음과 같이 auto_ptr이라는 객체를 통해
기존의 코드는 이처럼 바뀌게 될 것이다.

자, 이렇게 함으로써,
pa->process();
에서 예외가 발생하더라도, 메모리 누수는 발생하지 않을 것이다.
"보고 있나 플머?"ㅋ

또한, 이와 같은 형식으로 해결 하는 또 하나의 누수 막기 스킬이 존재 한다고 하는데,
이는 window handle 에서도 사용할 수 있다고 한다.
코드를 보자.

이 코드의 문법상이나 올바름을 보지 말고.
흐름을 보도록하자.
핸들을 통해 window를 생성하고.
작업을 진행하고.
해제하는 일을 하는 함수인 displayInfo는.
예외가 발생하면 리소스 누수를 일으킬 수 있는 여건을 가지고 있다.

이와 같은 부분에 대해서 해결책은 auto_ptr과 매우 흡사하다.
바로 코드를 보도록 하자.

마찬가지로 흐름을 보자.
문법은 조금 옳바르지 않을 수 있다.
여튼, 다음처럼 windowhandle을 받는 클래스를 생성하였고.
이제 displayInfo는 메모리 누수를 일으키지 않을 것이다.

auto_ptr과 마찬가지로 추가적인 delete 작업,
즉, destroyWindow는 하지 않아도 된다.

이 처럼, 이번 항목에서 의미 하는 것은,
예외가 발생하였을 때 생기는 메모리 누수를 막기 위해선,
해당 객체를 그냥 포인터로 선언하지 말고,
생성과, 해제를 포괄적으로 담당하는 객체를 생성하라는 것이다.

하지만 이런 부분에 대해서도 문제는 존재 하는데,
바로, 소멸자에서 리소스를 자동으로 해제하다가 생기는 예외처리.

이 부분에 대해선 항목 10, 11에 대해서 다시 언급한다고 하니.
일단 이번장에서 배운것 부터 재대로 기억하고 있자.
Posted by 안식의후크




포인터와 참조자의 기본 개념부터 파악해 보자.
여러 좋은 예, 상황에 비유 할 수도 있지만 가장 큰 차이점과, 비슷한 점을 생각해 보았을 때
주소를 통해 접근, 같은 이름공간을 사용한 접근. 이라고 생각한다.

포인터든, 참조자든 사용하는 이유는 말 그대로 다른곳에 저장되어 있는 정보를 접근하여, 변경. 사용하기 위해서라고 생각하는데, 접근 하는 방식이 다르다고 보면 될 것 같다.

1. 참조자는 Null 의 개념이 존재 하지 않는다.
 즉, 생성과 동시에 이미 값이 존재하여야 한다는 것이다.


2. 상황에 따른 적절함이 필요 하다.
 



이것이 바로 함정이다. string& rs; 를 먼저 보고 생각한다고 하면, rs가 참조하는것을 s1에서 s2로 변형한것 같지만, 사실은 그렇지 않다. s2의 값을 s1에 대입해 버린것이다.

rs, s1, s2를 출력하면 모두다 같은 결과(Test2)가 나올것이다. 잘못됐다는 것이 아니라, 애초에 참조자를 쓴다는것 자체가 같은 이름 공간으로 취급하는 것이기 때문에,
s1 = s2; 를 의도한 것이라면 재대로 한것이 맞지만, 단순히 참조하는 대상을 바꾸기 위해서 사용 하였다면 크게 실수했다는 것이다.

마지막으로, 포인터를 썻을 때 어색해지는 구문일때 참조자를 사용하라고 되어 있지만.
이 부분에 대해서는 지금 구지 집고 넘어갈 필요는 없을 것 같다.
Posted by 안식의후크
2010.03.21 17:41

this 포인터 프로그래밍/C++2010.03.21 17:41







this 포인터,
자기 자신을 호출하는 포인터.
자기 참조 포인터라고도 하는데

크게 어려운건 없다.





'프로그래밍 > C++' 카테고리의 다른 글

복사 생성자, 디폴트 생성자 그리고 디폴트 복사 생성자.  (0) 2010.03.21
friend  (0) 2010.03.21
this 포인터  (0) 2010.03.21
객체 포인터 배열  (0) 2010.03.21
클래스의 활용  (0) 2010.03.20
class(클래스) ~ C++의 꽃 ~  (0) 2010.03.19
Posted by 안식의후크
2010.03.19 00:28

정말 사소한 팁. 프로그래밍/사소한 팁2010.03.19 00:28







int형 레퍼런스를 리턴하는 함수와

쓰일것 같지 않은 캐스팅 연산자,

하지만 알고 있으면 언젠간 쓸일이 있겠지.

있겠지...?

있나..

있을까--a;;


결과는 다음과 같다.
결과를 보면 알 수 있겠지만,

전역변수 n1의 값이 변한 것을 알 수 있다.

return된 n1의 값에 10이 들어간것,
포인터를 이용해서 그 주소를 사용하여 어떻게 저떻게 하는것도 가능할 법 하지만
너무 복잡하게 생각하진 말자, 일단 그낭하다는 것만 알고 있자.
만약 저렇게 리턴되는 값에 대해서 변경을 막고 싶다면
그냥 앞에 const를 붙히기만 하면 되니 막는 법은 간.단.

pval과 val의 경우엔 사실 구지 실행해 보지 않아도 알 수 있지만,
val의 주소를 val에 넣었다고 보면 된다.
Posted by 안식의후크
2010.03.18 09:47

레퍼런스(Reference) 프로그래밍/C++2010.03.18 09:47







C++에서 추가된 기능으로 주소값을 넘겨주는 &연산자를 변수 선언시에 사용함으로써,

같은 메모리 공간을 사용하는 2개의 변수( 1개의 변수와 그 변수의 별칭 정도가 더 맞는 표현일지도 모르겠다)를 말한다.

같은 값을 가르킨다는 것에서 포인터와 비슷하다고 할 수도 있지만 그 개념은 조금 다르다.

레퍼런스 설정 방법




디버그 화면을 보면 알 수 있지만

포인터처럼 *a의 값이 10이 아니다

그냥 a자체가 10을 가지고 있다는 것이 포인터와 다른 점이라고 할 수 있겠다.

실제로 &사용해서 값을 받으면

int n1 = 10;
int a; 를 사용하나
int &a = n1;

실제 사용할때는 int a 나 int& a 나 차이가 없다는 것이다.

내가 봤을땐 포인터가 할 수 있는 일은 레퍼런스도 할 수 있고

레퍼런스가 할 수 있는 일은 포인터도 할 수 있는데,

구지 나눠서 써야 하는가? 하는 생각도 들긴 하지만,,,

그건 좀 더 생각해 봐야할 일인거 같고.

레퍼런스에 대해서 몇가지만 더 집어보고 넘어가자.



이정도면 충분할 듯.

'프로그래밍 > C++' 카테고리의 다른 글

클래스의 활용  (0) 2010.03.20
class(클래스) ~ C++의 꽃 ~  (0) 2010.03.19
레퍼런스(Reference)  (0) 2010.03.18
new & delete  (0) 2010.03.17
const 상수화  (0) 2010.03.17
namespace(이름 공간)  (0) 2010.03.15
Posted by 안식의후크
2010.03.17 10:38

와일드 포인터 프로그래밍/C언어2010.03.17 10:38







과 같은 경우에 n1은 널포인터, n2는 와일드 포인터 라고 한단다.

용어적인 이야기인듯.

'프로그래밍 > C언어' 카테고리의 다른 글

와일드 포인터  (0) 2010.03.17
단일 연결리스트(linked list)  (0) 2010.03.12
문자열 함수들 str___  (0) 2010.03.11
enum  (0) 2010.03.11
전처리기(4)  (0) 2010.03.10
전처리기(3)  (0) 2010.03.10
Posted by 안식의후크
2010.03.09 12:32

함수 포인터 프로그래밍/C언어2010.03.09 12:32







함수에 대해서 포인터를 사용하여 활용 하는 방법

소스를 보면 이해가 갈듯, 어디서 써야 할지는 솔직히 잘 모르겠다;

함수의 인자로 함수를 보내나?? 흠--a;



소스, 결과 참조



ps : 알아 보니, 함수 포인터는 주로 랜더링에서 사용을 하게 된다는데,
게임 루프내에서 랜더링 함수를 실행 하게 될때
랜더1()
랜더2()
등등랜더()
를 하기 보다
루프전에 함수포인터에 넣어 주어
for를 사용해 간략하게 표현하기 위함이라고 한다.

'프로그래밍 > C언어' 카테고리의 다른 글

__FILE__, __LINE__  (0) 2010.03.10
함수 포인터(2)  (0) 2010.03.10
함수 포인터  (0) 2010.03.09
2차원 배열 동적 할당  (0) 2010.03.09
가변 인수  (0) 2010.03.08
문자열과 배열  (0) 2010.03.08
Posted by 안식의후크
2010.03.08 19:10

문자열과 배열 프로그래밍/C언어2010.03.08 19:10




사실 이 부분은 크게 중요하진 않지만 언제 어떻게 쓰일지 모르는게 배열과 문자열인것 같다.

특별한 건 없고 포인터 변수를 사용하여 문자열을 저장하는 것과,
strlen을 사용하지 않고, 배열의 사이즈를 파악, 생성 하는 것과
간단한 출력 방법을 코딩하였다.



사실 str___과 같은 함수를 쓰면 쉽게 해결 할 수 있는 것이기도 하지만
const와 sizeof를 사용하여 초기에 배열을 설정해 줄 수 있다는 장점이 있다.(물론 실행중에 변경을 할려면 결국 동적할당을 해야겠지만)
const를 쓰지 않으면 배열을 생성 할 수 없는데,
배열을 초기화 하기 위해서는 상수화된 숫자가 필요 하기 때문이다.

'프로그래밍 > C언어' 카테고리의 다른 글

2차원 배열 동적 할당  (0) 2010.03.09
가변 인수  (0) 2010.03.08
문자열과 배열  (0) 2010.03.08
재귀 호출  (0) 2010.03.08
bit연산자 - & | ^ << >> (3)  (0) 2010.03.08
bit연산자 - & | ^ << >> (2)  (0) 2010.03.08
Posted by 안식의후크