בעיה קטנה בהבנת קוד

בעיה קטנה בהבנת קוד

לא צריך לקרוא את כל הקוד עד הסוף אבל אעתיק הכל לפה בכל זאת, ואדגיש את השורה המוזרה משהו (הקוד לקוח מThinking In CPP):
#include "../require.h" #include <string> #include <iostream> using namespace std; class Dog { string nm; public: Dog(const string& name) : nm(name) { cout << "Creating Dog: " << *this << endl; } // Synthesized copy-constructor & operator= // are correct. // Create a Dog from a Dog pointer: Dog(const Dog* dp, const string& msg) : nm(dp->nm + msg) { cout << "Copied dog " << *this << " from " << *dp << endl; } ~Dog() { cout << "Deleting Dog: " << *this << endl; } void rename(const string& newName) { nm = newName; cout << "Dog renamed to: " << *this << endl; } friend ostream& operator<<(ostream& os, const Dog& d) { return os << "[" << d.nm << "]"; } }; class DogHouse { Dog* p; string houseName; public: DogHouse(Dog* dog, const string& house) : p(dog), houseName(house) {} DogHouse(const DogHouse& dh) : p(new Dog(dh.p, " copy-constructed")), houseName(dh.houseName + " copy-constructed") {} DogHouse& operator=(const DogHouse& dh) { // Check for self-assignment: if(&dh != this) { p = new Dog(dh.p, " assigned"); houseName = dh.houseName + " assigned"; } return *this; } void renameHouse(const string& newName) { houseName = newName; } Dog* getDog() const { return p; } ~DogHouse() { delete p; } friend ostream& operator<<(ostream& os, const DogHouse& dh) { return os << "[" << dh.houseName << "] contains " << *dh.p; } }; int main() { DogHouse fidos(new Dog("Fido"), "FidoHouse"); cout << fidos << endl; DogHouse fidos2 = fidos; // Copy construction cout << fidos2 << endl; fidos2.getDog()->rename("Spot"); fidos2.renameHouse("SpotHouse"); cout << fidos2 << endl; fidos = fidos2; // Assignment cout << fidos << endl; fidos.getDog()->rename("Max"); fidos2.renameHouse("MaxHouse"); }​
הבעיה שלי היא בקטע של הnew. הרי כבר יש מקום בזיכרון שמוקצה לp אז מדוע הוא עושה new?. ניסיתי להוסיף לקוד חזרות רבות של השוואת doghouse אחד לאחר וראיתי שהמקום בזיכרון שהתוכנית תופסת עולה באופן ניכר (הורדתי את התוספות שזה מוסיף לאובייקט במקרה של העתקה). בכל מיקרה אני מניח שזו טעות שלי ושאני לא מבין פה משהו אז אם מישהו יסביר לי זה יהיה נחמד. תודה
 
אוף למה זה מגיע לי!

הדגשתי בטעות את בנאי ההעתקה, והתכוונתי להדגיש את פונקציה האופרטור= ישר אחריו.
 

gmorphus

New member
הסבר

DogHouse& operator=(const DogHouse& dh) { // Check for self-assignment: if(&dh != this) { p = new Dog(dh.p, " assigned"); houseName = dh.houseName + " assigned"; } return *this; }​
p הוא מצביע בתוך "המלונה" (מחלקה DogHouse) ל"כלב" (מחלקה Dog). אז אנחנו יוצרים כלב חדש, כשאנחנו מעתיקים את השם שלו מהכלב שהיה ב"מלונה" הישנה למלונה החדשה. אנחנו מוסיפים assigned לשם כדי שנדע שהוא מועתק. ד"א, אם אני לא טועה (ואנא תקנו אותי אם אני כן), יש כאן דליפת זיכרון. כאתה משתמש באופרטור = ויוצר כלב חדש אתה לא מוחק את הכלב שהיה במלונה קודם לכן... (אני יודע שזה לא אתה כתבת אלא הספר...)
 

voguemaster

New member
שמתי לב..

אולי זה בכוונה כדי להדגים משהו ? יכול להיות... ואם זה לא בכוונה אז זה מחדל. צריך לשחרר את האובייקט שמוצבע ע"י p לפני שעושים assignment. נו שוין
 
חחח

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

gmorphus

New member
glad we could help

אבל פעם הבאה תחסוך לכולנו מאמץ אם פשוט תשאל את השאלה... האופן כללי זו אסטרטגיה נכונה, להסביר מה אתה חושב ולמה הגעת בעצמך, ואז להציג את הבעיה/שאלה שיש לך. לאנשים יהיה הרבה יותר לעזור לך ככה וכולנו נחיה באושר ועושר עד עצם היום ההוא.
 
ממ חשבתי שזה מה שעשיתי:

"הבעיה שלי היא בקטע של הnew. הרי כבר יש מקום בזיכרון שמוקצה לp אז מדוע הוא עושה new?. ניסיתי להוסיף לקוד חזרות רבות של השוואת doghouse אחד לאחר וראיתי שהמקום בזיכרון שהתוכנית תופסת עולה באופן ניכר..." אבל לא משנה ותודה רבה
 
למעלה