Smart Pointers Nir Adar

Similar documents
גירסה

מערכים שעור מס. 4 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

Algorithms. Intro2CS week 5

תכנות מונחה עצמים משחקים תשע"ו

Introduction to Programming in C תרגול 8

ספרית התבניות הסטנדרטית (STL) כתיבת אלגוריתמים גנריים מצביעים חכמים. .vector. list iterator נכיר תחילה את האוסף הפשוט ביותר בספריה

Computer Programming A תרגול 9

מבוא לתכנות ב- JAVA תרגול 7

במידה ולסעיף ניתנה תשובה ובנוסף נרשם לגבי הסעיף לא יודע/ת אזי הניקוד שיינתן

Programming in C תרגול 8

מבוא למדעי המחשב תרגול 8 רשימה משורשרת כללית, Comparator

Tutorial 10. Introduction to C++ שימו

מצליחה. 1. int fork-bomb() 2. { 3. fork(); 4. fork() && fork() fork(); 5. fork(); printf("bla\n"); 8. return 0; 9. }

תרגול 12. Standard Template Library כתיבת אלגוריתמים גנריים מצביעים חכמים

הנכות 1 םוכיס לוגרת 13 1

דף הדרכה ליצירת שרת/ לקוח עם GUI

Nir Adar

הנכות 1 םוכיס לוגרת 13 1

תוכנה 1 * לא בהכרח בסדר הזה

מבוא לתכנות בשפת C. Tzachi (Isaac) Rosen

תכנות מתקדם בשפת C משתנים

מבוא לתכנות תוכנית שעור מס. 1 1 דר' דרור טובי, המרכז האוניברסיטאי אריאל בשומרון.

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes

תוכנה 1 בשפת Java נושאים שונים בהורשה רובי בוים ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב

תוכנה 1 תרגול מספר 13

תוכנה 1 תרגול מספר 13

תוכנה 1 תרגול 2: מערכים, מבני בקרה ושגיאות

Practical Session No. 14 Topological sort,amortized Analysis

הנכות 1 םוכיס לוגרת 13 1

Communication Networks ( ) / Spring 2011 The Blavatnik School of Computer Science, Tel-Aviv University. Allon Wagner

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

תוכנה 1 תרגול 2: מערכים ומבני בקרה

Simple Web Service. namespace MyService { public class Service1 : System.Web.Services.WebService {

מחרוזות ב Java ותכנות מונחה בדיקות )Test Driven Development(

הנכות 1 תואיגש םע תודדומתהו תואלול,םי : כרעמ 2 לוגרת

הנכות 1 תואיגש םע תודדומתהו תואלול,םיכרעמ : לו 2 גרת

תוכנה 1. תרגול מס' 3 עבודה עם מחרוזות )Strings( מתודות )Methods( העברת פרמטרים

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

תרגול 4 פונקציות. מבנה של פונקציה: public static <return value type> <function name> (<arg1 type> <arg1>, <arg2 type> <arg2>, ) { <function body> }

סכום (סדרת ערכים) אחרת - דוגמא: סכום-ספרות (num) אם < 10 num החזר 1 או אם = 0 = num החזר 0 public static int numofdigits (int num)

תוכנה 1 * לא בהכרח בסדר הזה

תוכנה 1 סמסטר א' תשע"א

$ gcc check.c. $ a.out. $ gcc check.c -o check. $ check. $ gcc -Wall check.c -o check. #include <stdio.h>

ASP.Net Web API.

מבוא למדעי המחשב תרגול 13: עצים בינאריים

כתבו קוד ב- 3 קבצי ה hpp (כתבו כהערה את שם הקובץ מעל) כך שהקוד יהיה תקין ובסגנון טוב. אין חובה

היצביט ומ - ןוכית ת וי נבת

Practical Session - Heap

הוראות חיבור e-port בפרוטוקול Art-Net למערכות תאורה שונות

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Loop through Arrays. Array Creation and Initialization

Amortized Analysis, Union-Find,

מבוא לתכנות ב- JAVA תרגול 6

פתרון מוצע לבחינת מה"ט ב_שפת c מועד אביב תשע"ח, פברואר 8102 מחבר: מר שייקה בילו, מכללת אורט רחובות

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Array Creation and Initialization. Loop through Arrays

תוכנה 1 3 תרגול מס' מערכים ומבני בקרה

מבוא לתכנות ב- JAVA מעבדה 2

מבוא למדעי המחשב תירגול 2: מבוא למדעי המחשב מ' - תירגול 2

עקרונות שפות תכנות 2016 תרגול 8 Type Inference System. Substitution Interpreter.

ת ונכת סרוק תורשוקמ תומישר :יעישת רועיש 1

שפת XML הפכה להיות נפוצה ובעלת תפקידים רבים, במיוחד עקב גמישותה הרבה:

מבוא למדעי המחשב תירגול 3:

מבוא לתכנות ב- JAVA תרגול 5. Ipc161- practical session 5

ב ה צ ל ח ה! אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ה תשרי תשע"ח 15/10/17 שמות המורים: ציון סיקסיק מיועד לתלמידי : א'

#1 - Introduction. Agenda

הנכות 1 םוכיס לוגרת 14 1

- מבחן. - 4 עבודות ב- JAVA. הגשה בזוגות דרך ה- System Submission

תרגילים ופתרונות בשפת - C הסתעפויות

הקלחמ ה תמרב ת ונ וכ ת (static members ) יליזרב דהוא Java תפשב ם דקת מ תונכת ביבא ל ת תטיסרבינוא

Smart Pointers - What, Why, Which?

תרגול 6 רקורסיה ותכנות מונחה עצמים

קורס תכנות כתובות בזיכרון כתובות בזכרון מצביעים וכתובות מצביעים וכתובות שיעור שביעי: מבנים, הקצאת זיכרון דינאמית האופרטור &

תוכנה 1 * לא בהכרח בסדר הזה

פתרון מוצע לבחינה בשפת C של מה"ט מועד אביב תשע"ז, פברואר 2017 מחבר: מר עסאקלה שאדי, מכללת אורט בראודה

שאלה 1 מהו הפלט של התוכנית הבאה:

מבוא לתכנות ב- JAVA מעבדה 3. Ipc161-lab3

Tirgul 4 Scheduling:

סעיף ב )11 נקודות( public synchronized void advance(staircase staircase) throws InterruptedException staircase!

קורס תכנות שיעור שישי: מחרוזות, מצביעים

מבני נתונים תכנות מונחה עצמים מבני נתונים. מחלקות אבסטרקטיות חבילות packages סיכום הרשאות גישה wrappers ADT מערך דינמי מחסנית

Advanced Lab in Computer Communications Meeting 1 Layers Model, Codes, Ethernet. Instructor: Tom Mahler

תוכנה 1 תרגול מספר 10: תרגיל חזרה חברת הייטק בית הספר למדעי המחשב אוניברסיטת תל אביב

קורס תכנות בשיעור הקודם למדנו על רקורסיה שיעור שישי: מערכים פונקציה רקורסיבית שאלה חישוב נוסחאות רקורסיביות בשפת C

Object-Oriented Analysis and Design

Advanced Programming & C++ Language

Operating Systems. Practical Session 4 Threads

משתנים שעור מס. 2 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

3 Dynamic Routing A (RIP and OSPF)

פרק 15 טיפוס חדש: מבנים שימוש במבנים שימוש במבנים שימוש במבנים

שיעור מספר 3: "מחלקות וטיפוסים"

מבוא לשפת סי סוגי לולאות שבוע שעבר... תוכנייה. לולאת while דוגמא: קליטת מספר חיובי ד'/כסלו/תשע "ב. משפטי if משפטי switch סוגי לולאות בשפת C דוגמאות

הערה על הפתרון: בתנאי הקדם אין לבדוק שהמשחק לא השתנה. המתודה מוגדרת היטב ויש לה ערך החזרה למקרה זה.

תזכורת: עץבינארי מבוא למדעי המחשב הרצאה 24: עצי חיפוש בינאריים

קורס תכנות שיעור שני: שימוש במשתנים,

מבוא למדעי המחשב 2018 תרגול 7

תרגול מספר 3: מערכים

תוכנה 1 תרגול מספר 10: תרגיל חברת הייטק בית הספר למדעי המחשב אוניברסיטת תל אביב

<exp> ::= <define> <cexp> <define> ::= ( define <var-decl> <cexp> ) / DefExp(var:VarDecl, val:cexp)

Introduction to OOP. Contents:

תרגול 7 רשימות משורשרות, רקורסיית

יישומונים (Applets) 2007 Zindell Technologies, Ltd. הקדמה. המגבלות על פעולותיו של ה- applet. המחלקה Applet. המחלקה Graphics.

Transcription:

7.1.2005 גירסה 1.00 Smart Pointers מסמך זה הורד מהאתר. אין להפיץ מסמך זה במדיה כלשהי, ללא אישור מפורש מאת המחבר. מחבר המסמך איננו אחראי לכל נזק, ישיר או עקיף, שיגרם עקב השימוש במידע המופיע במסמך, וכן לנכונות התוכן של הנושאים המופיעים במסמך. עם זאת, המחבר עשה את מירב המאמצים כדי לספק את המידע המדויק והמלא ביותר. Nir Adar Email: underwar@hotmail.com Home Page: כל הזכויות שמורות ל אנא שלחו תיקונים והערות אל המחבר. -1-

Smart Pointers מבוא מסמך זה עוסק ב- Pointers Smart בשפת ++C. Smart Pointers הם אובייקטים המתנהגים כמו מצביעים רגילים, אולם מציעים פונקציונליות נוספת. הבעיה העיקרית עם שימוש במצביעים בשפת ++C היא שחרור זיכרון. פעמים רבות מתכנתים שוכחים לשחרר זיכרון, או מנסים לשחרר שוב זיכרון שכבר שוחרר. Smart Pointer באים לעזור לנו בנושא זה. Smart Pointers הם שם כללי לאובייקטים החושפים למשתמש בהם התנהגות הדומה לזו של מצביעים. שפת ++C כוללת מימוש של smart pointers בספריה הסטנדרטית שלה, בשם,auto_ptr ובו יעסוק בעיקר מסמך זה. על מנת להשתמש במימוש זה, נכלול את הספריה.<memory> #include <memory> using std::auto_ptr; void foo() MyClass* p(new MyClass); p->dosomething(); delete p; כיצד משתמשים ב- pointers?smart נביט בקוד הבא: אם נכתוב קוד זה שוב, תוך שימוש ב- pointers,smart הוא ייראה כך: void foo() auto_ptr<myclass> p(new MyClass); p->dosomething(); נשים לב: בסוף הקוד הנ"ל האובייקט p ידאג אוטומטית לשחרור הזכרון שהוקצה. -2-

דוגמא לשימוש הקוד הבא מציג שימוש פשוט ב- pointers :smart #include <iostream> #include <memory> using namespace std; int main() auto_ptr<int> p; int i = 7; p.reset(&i); cout << "The pointer points to: " << *p << endl; *p = 10; cout << "Contents of i: " << i << endl; return 0; אנו יוצרים smart pointer המשמש כמצביע ל- int, ובתחילה לא מאתחלים אותו (במקרה זה, הוא יאותחל אוטומטית להצביע אל.(NULL על ידי שימוש בפונקציה reset() אנחנו גורמים למצביע להצביע אל i. (הערה: אם p היה מצביע קודם לכן אל זיכרון אחר, הוא ישחרר אותו לפני שיעבור להצביע אל i). לאחר מכן אנחנו מבצעים מניפולציות על ה- pointer.smart כפי שניתן לראות, הוא מתנהג תחבירית בצורה זהה לזו של מצביע רגיל. בסוף התוכנית, כאמור, משוחרר הזיכרון באופן אוטומטי. -3-

מדוע נרצה להשתמש ב- pointers?smart 1. מניעת באגים שימוש ב- pointers smart מונע באגים שונים: שחרור אוטומטי של זיכרון: כמו שראינו בדוגמא, הזכרון עבור המצביע משתחרר אוטומטית בסוף הבלוק, ולכן איננו צריכים לדאוג לגבי שחרור הזכרון. אתחול אוטומטי של המצביע: כאשר אנחנו יוצרים smart pointer שאינו מצביע לכלום, ה- default constructor שלו דואג לאתחל אותו ל- NULL. שוב, אנחנו חוסכים כאן פעולה שהיינו עלולים לשכוח. Dangling pointers :Dangling pointers זהו מצב בו מצביע מכיל כתובת של אובייקט שכבר שוחרר, לדוגמא: MyClass* p(new MyClass); MyClass* q = p; delete p; p->dosomething(); // p is now dangling! This line is a bug p = NULL; // p is no longer dangling q->dosomething(); // q is still dangling! smart אחד בתוך smart pointer מציע התנהגות הפותרת את הבעיה. במידה ונשים תוכן של auto_ptr pointer אחר, הראשון יעבור להצביע אל,NULL וכך smart pointers דואגים שיהיה בו זמנית רק מצביע אחד אל אותו הזיכרון. Exception Safety.2 נביט בקטע הקוד הבא: void func() Element *elem = new Element; elem->dosomething(); delete elem; -4-

Element היא מחלקה שהוגדרה על ידינו קודם. נשים לב: אם במהלך הפונקציה,elem->DoSomething() אז הזיכרון שהוקצה עבור elem לא ישוחרר אף פעם! הפתרון: שימוש ב- pointers.smart התוכנית הבאה מדגימה את התופעה: #include <iostream> #include <memory> #include <stdexcept> using namespace std; class Element public: Element() cout << "Ctor - Element" << endl; ~Element() cout << "Dtor - Element" << endl; ; void DoSomething() throw runtime_error("some Error"); void func() Element *elem = new Element; elem->dosomething(); delete elem; void func2() auto_ptr<element> elem(new Element); elem->dosomething(); int main() cout << "Stage 1" << endl; try func(); catch(...) -5-

cout << "Stage 2" << endl; try func2(); catch(...) return 0; פלט התוכנית יהיה: Stage 1 Ctor - Element Stage 2 Ctor - Element Dtor - Element במקרה הראשון, בו השתמשנו במצביע רגיל, לא נקראה הפונקציה ההורסת של האובייקט. דוגמאות לשימוש ב- Pointers Smart בתוכנית הבאה ישנה מתודה המקצה זיכרון ומחזירה מצביע אליו. כאשר נגמר השימוש בו, הזכרון משתחרר מעצמו. שימוש זה ב- pointers smart הינו נפוץ ביותר. #include <iostream> #include <memory> using namespace std; class Element public: Element() cout << "Ctor - Element" << endl; ~Element() cout << "Dtor - Element" << endl; ; typedef auto_ptr<element> PElem; class Generator public: static PElem CreateElement() PElem p(new Element()); return p; ; -6-

int main() PElem ref = Generator::CreateElement(); cout << "Main :: Before Exit" << endl; return 0; פלט התוכנית: Ctor - Element Main :: Before Exit Dtor - Element נשים לב שלכאורה הזכרון יכל להשתחרר בסיום הפונקציה,CreateElement מכיוון ש- p הוא משתנה לוקלי שלה. אם זאת, מכיוון ש- p מועתק אל ref לפני שהוא משוחרר, ומכיוון שהעתקה גורמת ל- p להצביע על,NULL הזכרון לא משתחרר באמת, ובחזרה מהפונקציה ref מצביע על הזיכרון שיצרנו. -7-

מקורות 1. Addison-Wesley (1999), "Using auto_ptr Effectively" 2. Andrei Alexandrescu (2003), "Smart Pointers in C++" 3. Herb Sutter (2002), "The New C++: Smart(er) Pointers" 4. Juha Vihavainen (2004), "C++ Programming Techniques and Idioms" 5. Yonat Sharon, (1999), "Smart Pointers - What, Why, Which?" -8-