Microsoft PowerPoint - lecture2.ppt

Similar documents
1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

chap10.PDF

C# Programming Guide - Types

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

Microsoft PowerPoint - ch07 - 포인터 pm0415

chap 5: Trees

슬라이드 1

1

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

untitled

Microsoft Word - FunctionCall

자바 프로그래밍

Chapter 4. LISTS

11강-힙정렬.ppt

No Slide Title

금오공대 컴퓨터공학전공 강의자료

歯처리.PDF

Something that can be seen, touched or otherwise sensed

제 1 장 기본 개념

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

11장 포인터

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - additional08.ppt [호환 모드]

JVM 메모리구조

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft Word - ExecutionStack

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

2007_2_project4

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

Design Issues

Microsoft PowerPoint - C++ 5 .pptx

BACK TO THE BASIC C++ 버그 헌팅: 버그를 예방하는 11가지 코딩 습관

Microsoft PowerPoint - Chapter 6.ppt

Modern Javascript

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

PowerPoint Template

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 02-Class Review.pptx

C++ Programming

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

BMP 파일 처리

Frama-C/JESSIS 사용법 소개

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - 04-UDP Programming.ppt

adfasdfasfdasfasfadf

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap06-2pointer.ppt

제 1 강 희망의 땅, 알고리즘

설계란 무엇인가?

11장 포인터

슬라이드 1

6.1 Addresses and Pointers Recall memory concepts from Ch2 ch6_testbasicpointer.c int x1=1, x2=7; double distance; int *p; int q=8; p = &q; name addre

강의10

슬라이드 1

슬라이드 1

Microsoft PowerPoint - o8.pptx

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

6주차.key

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Deok9_Exploit Technique

SIGPLwinterschool2012

Microsoft PowerPoint - chap06-5 [호환 모드]

01-OOPConcepts(2).PDF

C++ Programming

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

UI TASK & KEY EVENT

Microsoft PowerPoint - additional07.ppt [호환 모드]

Hi-MO 애프터케어 시스템 편 5. 오비맥주 카스 카스 후레쉬 테이블 맥주는 천연식품이다 편 처음 스타일 그대로, 부탁 케어~ Hi-MO 애프터케어 시스템 지속적인 모발 관리로 끝까지 스타일이 유지되도록 독보적이다! 근데 그거 아세요? 맥주도 인공첨가물이

No Slide Title

Chapter 4. LISTS

7장

유니티 변수-함수.key

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

Microsoft PowerPoint - 9ÀÏ°_ÂüÁ¶ÀÚ.ppt

설계란 무엇인가?

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

쉽게 풀어쓴 C 프로그래밍

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

JUNIT 실습및발표

untitled

Microsoft PowerPoint - chap6 [호환 모드]

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

C++ Programming

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

gnu-lee-oop-kor-lec06-3-chap7

12-file.key

Microsoft PowerPoint - additional06.ppt [호환 모드]

신림프로그래머_클린코드.key

슬라이드 제목 없음

Microsoft PowerPoint Predicates and Quantifiers.ppt

Microsoft PowerPoint - chap11-포인터의활용.pptx

PowerPoint Template

설계란 무엇인가?

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

Introduction to Geotechnical Engineering II

(72) 발명자 이동희 서울 동작구 여의대방로44길 10, 101동 802호 (대 방동, 대림아파트) 노삼혁 서울 중구 정동길 21-31, B동 404호 (정동, 정동상 림원) 이 발명을 지원한 국가연구개발사업 과제고유번호 부처명 교육과학기술부

Transcription:

Overview s & osg::referenced Class & osg::ref_ptr<> Template Class 개요 OSG OSG::Referenced Class OSG::ref_ptr<> Template Class 2008년여름박경신 2 스마트포인터 () 는 C++ class 이다. syntax 와 semantics 상일반포인터와같다. memory management 나 locking 등좀더유용한일을수행한다. 가장간단한스마트포인터의예로 C++ standard 에있는 auto_ptr // auto_ptr 내부 template <class T> class auto_ptr T* ptr; public: explicit auto_ptr(t* p = 0) : ptr(p) ~auto_ptr() delete ptr; T& operator*() return *ptr; T* operator->() return ptr; //... ; 3 auto_ptr 를사용하여아래와같이바꿀수있다. void foo() MyClass* p(new MyClass); p->dosomething(); delete p; void foo() auto_ptr<myclass> p(new MyClass); p->dosomething(); // MyClass 의 DoSomething 함수를쓴다 // p 가알아서 scope 를벗어나면 clean up 해준다 4

template<class T> class SmartPtr // your own SmartPtr class public: explicit SmartPtr(T * pointee) : pointee_(pointee); SmartPtr& operator=(const SmartPtr& other); ~SmartPtr() delete pointee_; ; T& operator*() const // operator overloading return *pointee_; T* operator->() const // operator overloading return pointee_; operator T*() return pointee_; // conversion private: T *pointee_; class Widget public: void Fun(); ; int main() // SmartPtr<Widget> sp = new Widget() 과같은코드 SmartPtr<Widget> sp(new Widget); sp->fun(); (*sp).fun(); // (sp.pointee_)->fun() 과같은코드 ; 5 6 Why would I use? 기존의포인터쓰는방식은 Widget *p = new Widget; 즉, 변수 p 는 Widget 개체를위해할당된메모리를 point 하고또한 owns 하고있는것이다. 따라서, 프로그래머는 delete p 를불러서 Widget 개체를지우고또한메모리해제를하게된다. 때문에, p 로포인트된개체의 ownership 을해제하려면다음과같이써야한다. p = NULL; // assign something else to p 대부분의스마트포인터는다양한방법 (ownership transfer, reference counting, etc) 으로 ownership management 를해준다. 7 를사용해서우리가얻는것은무엇인가? Automatic cleanup 포인터를 free 할필요없다. Automatic initialization 스마트포인터를 NULL 로초기화할필요없다. Dangling pointers Exception safety try/catch 를고민하지않아도된다. Garbage collection Efficiency 스마트포인터가가용메모리의사용을좀더효과적으로만들어주며메모리할당과해제시간을줄어준다. STL containers 8

Why would I use? Why would I use? MyClass* p(new MyClass); MyClass* q = p; delete p; p->dosomething(); // Watch out! p is now dangling! p = NULL; // p is no longer dangling q->dosomething(); // Ouch! q is still dangling! // auto_ptr 은 copy 할때자신의 ptr 를 NULL 로만들어주어 dangling pointer 문제해결 template <class T> auto_ptr<t>& auto_ptr<t>::operator=(auto_ptr<t>& rhs) if (this!= &rhs) delete ptr; ptr = rhs.ptr; rhs.ptr = NULL; return *this; Create a new copy of the object pointed by p Ownership transfer: it transfer the responsibility for cleaning up ("ownership") from p to q Reference counting Reference linking class Base /*...*/ ; class Derived : public Base /*...*/ ; Base b; Derived d; vector<base> v; v.push_back(b); // OK v.push_back(d); // error // 다른 class 의개체를사용하고자한다면포인터를사용해야함 vector<base*> v; v.push_back(new Base); // OK v.push_back(new Derived); // OK too // you need to cleanup! for (vector<base*>::iterator i = v.begin(); i!= v.end(); ++i) delete *i; Copy on write 9 10 Why would I use? // 스마트포인터를사용하면자동으로 clean up 해줌 class Base /*...*/ ; class Derived : public Base /*...*/ ; Base b; Derived d; vector< linked_ptr<base> > v; v.push_back(new Base); // OK v.push_back(new Derived); // OK too // cleanup is automatic 일반적인시나리오경우, OSG 응용프로그램은 scene graph 의 root node 로포인트를하고있다. 그리고, root node 의포인터가 scene graph 의모든노드 (node) 로 reference 하고있다. 11 12

OSG 응용프로그램에서 scene graph 사용이끝나면메모리누수 (memory leak) 을피하기위해각노드마다차지하고있던메모리를 delete 해야한다. 전체 scene graph 를 traverse 하면서각노드 ( 와데이터 ) 를 delete 하는일은매우복잡한일이다. 이문제의해결방법으로 reference counted memory 를사용한 automated garbage collection 을사용해야한다. 모든 OSG 노드는 reference counted 되어있어서, reference count 가 0 으로줄면개체를 delete 한다. 따라서, OSG 의전체 scene graph 를지우려면 root node 포인터하나만지우면된다. 13 14 모든 OSG 노드와 scene graph 데이터클래스는공통베이스클래스인 osg::referenced 에서파생 (derived) 되어있다. osg::referenced 는 integer 타입 reference count 와이것의증가 (increment) 와감소 (decrement) 방법을가지고있다. OSG 는 osg::ref_ptr<> 라불리는 smart pointer template class 를정의하고있다. ref_ptr<> 변수를사용하여 heap 에할당되어있는 OSG 노드와 scene graph 데이터의주소를저장한다. 프로그램에서는 ref_ptr<> 변수로 referenced object 주소를할당했을때, reference count 가자동적으로증가한다. Referenced 에서파생한개체의포인터를저장한코드는반드시일반적인 C++ 포인터변수보다는 ref_ptr<> 에포인터로저장되어야한다. 그변수로할당된메모리를자동적으로 deletion해줄수있도록. ref_ptr<> 는 operator overloading을사용해서 ref_ptr<> 변수는일반적인 C++ 포인터변수와같이작동한다. ref_ptr<> 에서 operator ->() 와 operator *() 를 overloading 예외적인경우로, 일반적인 C++ 포인터변수를 Referenced에서파생한개체저장에 일시적 사용이가능하다 ( 만약그 heap memory address가궁극적으로 ref_ptr<> 에저장이된다면 ). 그러나일반적으로 ref_ptr<> 을사용하는것이안전하다. 15 16

OSG Referenced Class osg::referenced class reference counted block of memory 로구현되어있다. 모든 OSG nodes 와 scene graph data (state information, arrays of vertices, normals, texture coordinates 등을포함 ) 은이클래스로부터파생되었다. osg::referenced 클래스의 3 가지주요기능 Reference count member variable 인 _refcount 는클래스생성자 (constructor) 에 0 으로초기화되어있다. Public methods 인 ref() 와 unref() 는 _refcount 변수의증가 (incrementing) 과감소 (decrementing) 을담당하고있다. 그리고, unref() 는 _refcount 가 0 가되면개체를 delete 한다. 클래스소멸자 (destructor) 는 protected 와 virtual 이다. 즉, 스택 (stack) 에생성하거나명시적파괴 (explicit deletion) 는불가능하다. osg::ref_ptr<> template class Referenced 타입개체의스마트포인터 (smart pointer) 로구현되어있다. Reference count 를관리한다. Referenced 개체는마지막 ref_ptr<> 가 referencing 하고있는것이사라지게되면스스로자신을 delete 한다. ref_ptr<> 의주요기능 Private 포인터 _ptr 은 managed memory address 에저장된다. get() 함수를이용하여 _ptr 값을받는다. 프로그래머가 ref_ptr<> 을일반 C++ 포인터처럼사용할수있도록 operator->() 나 operator=() 같은다양한함수를제공한다. ref_ptr<> 이 NULL 이면 valid() 함수는 true 를반환한다. 17 18 프로그램에서 ref_ptr<> 변수로주소를할당할때, ref_ptr<> assignment operator 인 operator=() 가 Referenced::ref() 를불러서 reference count 를자동적으로증가시킨다. ref_ptr<> 변수가 Referenced::unref() 를부르면서 reference count 를감소할때의두가지경우는다음과같다. 클래스소멸자에서 ref_ptr<> deletion 할때 operator=() 에서 reassignment 할때 OSG의 osg::geode 클래스와 osg::group 클래스를사용하는예제 Geode는렌더링을위한 geometry를가지고있는 OSG leaf node이다. Group은여러개의children을가진하나의node이다. 예 : #include <osg/geode> #include <osg/ref_ptr> osg::ref_ptr<osg::geode> geode = new osg::geode; If (!geode.valid()) // ref_ptr<> is invalid, throw exception or display error 19 20

다른예제 #include <osg/geode> #include <osg/group> #include <osg/ref_ptr> // Create a new osg::geode object. The assignment to the // osg::ref_ptr<> increments the reference count to 1 osg::ref_ptr<osg::geode> geode = new osg::geode; // Assume grp is a pointer to an osg::group node. Group uses a // ref_ptr<> to point to its children, so addchild() again increments // the reference count to 2 grp->addchild(geode.get()); // The geode ref_ptr<> variable goes out of scope here. 21 // This decrements the reference count back to 1 전슬라이드의예제에서는코드에서오랫동안 geode 를유지하지않기때문에사실 ref_ptr<> 이필요하지않다. osg::group 부모노드에서내부적으로 ref_ptr<> 이 osg::geode 가차지하는메모리를관리하기때문에일반 C++ 로충분하다. // Create a new osg::geode object (regular C++ pointer). // Don t increments the child Geode increment the reference count 1 osg::geode *geode = new osg::geode; // Internal ref_ptr<> in Group increments the child node Geode // reference count to 1 grp->addchild(geode); 22 OSG에서 Referenced 개체는반드시 ref_ptr<> 변수에선언이되어야한다. 일반 C++ 포인터를사용할시주의할것. osg::geode * geode = new osg::geode; // don t do this, memory leak Referenced 에서파생된개체는명시적으로지울수없다. osg::geode geode1 = new osg::geode; delete geode1; // compile error: destructor is protected osg::geode geode2; osg::ref_ptr<osg::geode> geode = new osg::geode; // OK int i; osg::ref_ptr<int> rpi = &i; // NO! int is not derived from Referenced // top increments the Group count to 1 osg::ref_ptr<osg::group> top = new osg::group; // addchild() increments the Geode count to 1 top->addchild(new osg::geode); // The top ref_ptr goes out of scope, deleting both the // Group and Geode memory // compile error: destructor is protected 23 24

함수로개체의주소를반환 (Returning the address of an object) 할때주의해야한다. 잘못주소를반환했을경우, ref_ptr<> 가저장하고있는메모리주소가반환스택에돌려지기전에스코프를벗어나게된다. // Don t do this. It stores the address as the return value on the call // stack, but when the grp ref_ptr<> goes out of scope, the reference // count goes to zero and the memory is deleted. The calling function // is left with a dangling pointer. osg::group* creategroup() // Allocate a new Group node osg::ref_ptr<osg::group> grp = new osg::group; // return the new Group s address return *grp; 25 위의문제를해결하려면다음과같이사용해야한다. osg::ref_ptr<osg::group> creategroup() osg::ref_ptr<osg::group> grp = new osg::group; // return the new Group s address. This stores the Group address // in a ref_ptr<> and places the ref_ptr<> on the call stack as the // return value return grp.get(); 26 Summary Reference Referenced 에서파생된개체를 ref_ptr<> 변수로할당하는것은자동적으로 Reference::ref() 에서 reference count 를증가시킨다. 만약 ref_ptr<> 변수가다른것을포인트하게되거나또는지워지게되면 Referenced::unref() 를불러서 reference count 를감소시킨다. 그리고, 만약 reference count 가 0 가되면 unref() 는개체에할당된메모리를 delete 하게된다. Referenced 타입의개체를할당할때, 항상 ref_ptr<> 를지정해서 OSG 의메모리관리가정확히될수있도록한다. http://www.informit.com/articles/article.aspx?p=31529 http://ootips.org/yonat/4dev/smart-pointers.html 27 28