Summary

pchero on 10월 10th, 2010

 1. CPU의 관점에서 원하는 곳으로 패치시킨다는 것과 가장 관련 있는 CPU의 레지스터는 무엇인가?-> CPU의 관점에서 바라본 “원하는 곳으로 패치(Fetch) 시킨다”는 것은 현재 실행하고 있는 명령 다음에 어떤 명령을 실행시킬 것인가와 관련이 깊다. 따라서 다음번 명령어의 주소값을 저장하고 있는 PC(Program Counter) 레지스터이다.  2. 네트워크 관점에서 원하는 곳으로 패치(Fetch)시킨다는 용어는 무엇에 해당하겠는가?-> 네트워크 관점에서의 패치는 패킷을 전송하는 [...]

Continue reading about Chapter 1. 연습문제

pchero on 8월 9th, 2010

 입력 반복자를 이용하여 노드를 삽입시 많이 사용되는 반복자가 insert_iterator이다. 이 반복자를 이용하면 원하는 위치에 노드를 삽입하려 할 때 편하게 작업을 수행할 수 있다. 반복자의 사용 예를 보면 다음과 같다. #include <iostream>#include <list> using namespace std; int main(){  // 스트링을 저장할 리스트 선언 및 첫 번째 스트링 저장  list<string> strList;  strList.push_back(“AAA”);   // 리스트에 데이터를 입력하기 [...]

Continue reading about insert_iterator 반복자 활용

pchero on 8월 9th, 2010

 리스트는 순차형 컨테이너이면서 포인터 연산을 수행하기 때문에 특정 노드를 바로 찾아가는 키의 개념이 없다. 따라서 원하는 노드를 찾고자 할 때는 반복자를 이용하여 처음부터 차례대로 노드들을 체크해보아야 한다. 리스트는 이러한 단점에도 불구하고 인의의 노드의 삽입과 삭제가 무척 빠르고 효율적이기 때문에 활용가치가 무척 높은 자료구조이다.

Continue reading about 리스트

pchero on 8월 9th, 2010

 벡터는 원소의 상수 레퍼런스를 반환하는 메소드를 제공한다. 이 메소드를 이용하면 벡터 속에 있는 데이터를 바로 얻을 수 있다. 이러한 메소드에는 front(), back() 등이 있다.  다음은 front()와 back() 메소드의 간단한 사용 예를 보여주고 있다. strVec.push_back(“A”);  // 벡터 내부: AstrVec.push_back(“B”);  // 벡터 내부: A BstrVec.push_back(“C”);  // 벡터 내부: A B C cout << “시작: ” << strVec.front() [...]

Continue reading about 벡터

pchero on 8월 8th, 2010

 멀티 스레드를 이용한 프로그램을 작성한다든지 하면 디버거로도 버그를 찾기가 힘든 경우도 많다. 이러한 경우에도 고전적 디버거인 cout – 또는 printf() – 문은 큰 힘을 발휘한다. 즉 문제가 될 만한 곳에 계속해서 cout을 사용하는 것이다.  결론적으로 디버거의 사용법을 잘 익혀두는 것은 정말 큰 힘이 되지만, 그 이전에 적절한 곳에 로그를 남기도록 하는 것은 꼭 필요한 작업이다. [...]

Continue reading about 고전적 디버거인 로그

 디폴트로 호출되는 핸들러는 비정상적인 종료가 발생한다는 메시지만을 남기고 시스템을 종료시키는 역할을 수행한다. 이때 아무런 메시지를 남기지 않고 시스템이 종료되기를 원한다면 메모리 핸들러가 호출되지 않도록 만들면 된다. 그러려면 다음과 같이 set_new_handler 메소드를 NULL 파라미터와 함께 호출하여 핸들러의 실행을 막으면 된다.  set_new_handler(NULL);  set_new_handler 는 new.h 파일을 include 해야 사용할 수 있다. 만일 디폴트 핸들러가 아닌 개발자가 지정한 [...]

Continue reading about 디폴트로 호출되는 메모리 예외 핸들러를 변경해 보자.

pchero on 8월 8th, 2010

 메모리를 동적으로 할당한 뒤에 메모리를 해제시키지 않으면 생성된 메모리는 계속해서 시스템에 남게 된다. 따라서 해당 메모리의 사용이 끝나면 delete나 free를 통하여 메모리를 해제시켜야 한다. 예를 들어 다음 메소드의 경우 메소드가 실행될 때마다 메모리를 새오 할당하게 된다. void allocateMem(void){  AClass *aClass = new AClass();  aClass->aMethod();}  메소드의 실행이 끝나도 aClass 객체는 메모리에 남게 되는데, aClass 객체를 접근할 [...]

Continue reading about 메모리 동적 할당과 메모리 해제

 라이브러리 파일을 이용하여 실행파일을 만들 때 컴파일러의 옵션을 이용하는 방법이 있다. 이때 사용되는 옵션이 ‘-L’과 ‘-l’ 인데, -L 의 경우에는 사용하고자 하는 라이브러리가 포함된 디렉토리 명을 명시하는 옵션이고, -l 은 라이브러리의 이름을 적어주는 옵션이다. 이때 라이브러리의 이름은 lib 라는 말과 확장자 ‘.a’ 를 생략하여 사용할 수 있다. 즉, libMsg.a 의 경우 그냥 Msg 라고 쓰면 [...]

Continue reading about GCC 컴파일러에서 라이브러리 파일을 사용하는 법

 유닉스 상에서 GCC 컴파일러를 이용하여 라이브러리를 만들려면 먼저 다음과 같이 컴파일 과정을 통해 오브젝트 파일을 만들도록 한다.  % C++ -c Message.cpp  컴파일이 제대로 끝났으면 확장자로 ‘o’를 가진 Message.o 파일이 생성될 것이다. 이번에는 생성된 오브젝트 파일을 이용하여 라이브러리를 만들도록 한다. 이때 사용하는 명령어는 ar로 라이브러리 작성에 사용된다. 아래와 같이 ar 명령어와 옵션 그리고 생성하고자 하는 라이브러리의 [...]

Continue reading about GCC 컴파일러를 이용한 라이브러리 생성

pchero on 8월 8th, 2010

 메모리상에 있는 객체에 접근할 길이 없어졌을 때 객체는 생명을 다했다고 말할 수 있다. 접근할 길을 잃은 객체는 어떤 방법으로든 메모리를 실행환경에 되돌려줘야 한다. 객체의 소멸에서 한 가지 주의해야 할 점은 객체는 자기의 스코프가 끝나게 되면 소멸된다는 점이다. 다시 말해, 그 객체가 사용되는 범위를 넘어가게 되면 객체의 사용주기가 끝나게 된다는 것이다. 아래의 예제를 보도록 하자. class [...]

Continue reading about 객체의 스코프