Εμφάνιση 1-5 από 5
  1. #1
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Καλησπέρα.

    Λόγο του ότι θέλω να γίνω game developer και επίσης θέλω να ασχοληθώ με την γνώση game engine architecture
    έπρεπε να μάθω c++.

    Είμαι έμπειρος προγραμματιστής που γνωρίζω πολύ καλά αντικειμενοστραφή προγραμματισμό.
    Οι γλώσσες που γνωρίζω είναι c, java, python και λίγο c#.

    Εδώ και λίγες μέρες άρχισα να μαθαίνω c++.
    Έχω μάθει την σύνταξη της γλώσσα (δεν διαφέρει και τόσο από c) και επίσης έμαθα λίγα καινούρια πρότυπα από
    c++ 11.

    Αυτό που φοβάμαι κυρίως και σίγουρα δεν γνωρίζω καλά είναι το πως να διαχειρίζομαι την μνήμη
    όταν κάνω δομές δεδομένων χρησιμοποιώντας κλάσεις. Για παράδειγμα εάν κάνω μία συνδεδεμένη
    λίστα ή ένα δένδρο τη ακριβώς πρέπει να προσέχω; Πως απελευθερώνω μνήμη; Υπάρχει garbage collector;

    Επίσης απ'ότι έψαξα λίγο, το scope των αντικειμένων που δημιουργούνται έχει μεγάλη σχέση.
    Τα αντικείμενα καταστρέφονται όταν το πρόγραμμα "φύγει" από το scope στο οποίο υπάρχουν.
    Άρα τη πρέπει να προσέχω σε αυτήν την περίπτωση. Δηλαδή εάν έχω μία συνάρτηση που καλείται
    από την main και μέσα σε αυτήν έχω αντικείμενα κλάσεων , θα καταστραφούν όταν επιστρέψει
    στην main (και θα κληθεί ο deconstructor; ); Δηλαδή εάν με κάποιον τρόπο μπορώ να αναφερθώ
    σε κάποιο αντικείμενο που δημιουργήθηκε από μια άλλη κλάση η οποία έχει ήδη επιστρέψει
    δεν θα μπορώ να το κάνω επειδή το αντικείμενο έχει ήδη καταστραφεί; Αυτό ισχύει μόνο
    για αυτό:
    Κώδικας:
    My_Class_Name object;
    ή και για αυτό:
    Κώδικας:
    My_Class_Name object = new Object();
    ;

    Πρέπει να τις λύσω αυτές τις απορίες προτού αρχίσω σοβαρή δουλειά.

    Ευχαριστώ.
    Τελευταία επεξεργασία από το μέλος babaliaris : 14-07-16 στις 18:09.

  2. #2
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.442
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Καλησπέρα, εγώ έκανα ακριβώς την ανάποδη διαδικασία, έμαθα πρώτα c++ και μετά πήγα σε άλλες γλώσσες (c#, java).

    Η C++ είναι υπερβολικά δυνατή αλλά έχει το κακό ότι πρέπει να διαχειρίζεσαι μόνος σου τη μνήμη! Δεν υπάρχει garbage collector οπότε όπου δεσμεύεις εσύ μνήμη (μέσω του new) θα πρέπει αντίστοιχα να την αποδεσμεύεις! Συνήθως αν έχεις κλάσεις που έχουν σαν μεταβλητές δείκτες, χρησιμοποιείς το destructor για να την αποδεσμεύσεις! Αν δεν την αποδεσμεύσεις έγκειται στο σύστημα αν θα το κάνει κάποια στιγμή (σίγουρα αφού κλείσεις το πρόγραμμά σου).

    Αυτό που λες για το scope των μεταβλητών, είναι ακριβώς το ίδιο με την Java, C#! Όπως και εκεί κάθε φορά που τελειώνει ένα block αυτόματα καταστρέφονται οι μεταβλητές που ορίστηκαν μέσα σε αυτό. Όπως και στις άλλες γλώσσες θα καταστραφούν τόσο οι απλές μεταβλητές (int, float, MyClass κτλ) όσο και οι δείκτες (int*, float*, MyClass*).
    Η C++ επειδή δεν έχει garbage collector δεν θα ψάξει ποτέ να βρει ότι δεν υπάρχει reference σε κάποια θέση που έχει δεσμέυσει οπότε δεν θα πάει ποτέ να το αποδεσμεύσει! Οπότε θα έχεις ένα δεσμευμένο χώρο στη μνήμη (μέσω της new) για τον οποίο όμως δεν θα έχεις κανένα Pointer οπότε δεν θα μπορέσεις ποτέ να τον αποδεσμέυσεις!

    Γενικότερα πρέπει να θυμάσαι ότι για κάθε new πρέπει να υπάρχει και ένα delete το οποίο θα εκτελείται! Το ίδιο ισχύει και για τις δομές δεδομένων. Αν τις φτιάξεις ή τις χρησιμοποιείς με δείκτες τότε να φροντίσεις να τις αποδεσμεύεις κιόλας! Αν τις χρησιμοποιείς σαν MyClass x; τότε την αποδεσμεύει η c++ μόλις βγει εκτός scope!

    Αν έχεις μάθε c σε γενικές γραμμές δεν έχεις τίποτα να φοβάσαι (τουλάχιστον στο κομμάτι μνήμης). Ότι δεσμεύεις το αποδεσμεύεις και τέλος! Απλά θα μάθεις λίγο την διαφορετική σύνταξη της C++, δλδ Classes, References, Overloading!

    Ελπίζω να σε βοήθησα και να μην σε μπέρδεψα χειρότερα !
    Τελευταία επεξεργασία από το μέλος MitsakosGR : 15-07-16 στις 00:47.

  3. #3
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από MitsakosGR Εμφάνιση μηνυμάτων
    Καλησπέρα, εγώ έκανα ακριβώς την ανάποδη διαδικασία, έμαθα πρώτα c++ και μετά πήγα σε άλλες γλώσσες (c#, java).

    Η C++ είναι υπερβολικά δυνατή αλλά έχει το κακό ότι πρέπει να διαχειρίζεσαι μόνος σου τη μνήμη! Δεν υπάρχει garbage collector οπότε όπου δεσμεύεις εσύ μνήμη (μέσω του new) θα πρέπει αντίστοιχα να την αποδεσμεύεις! Συνήθως αν έχεις κλάσεις που έχουν σαν μεταβλητές δείκτες, χρησιμοποιείς το destructor για να την αποδεσμεύσεις! Αν δεν την αποδεσμεύσεις έγκειται στο σύστημα αν θα το κάνει κάποια στιγμή (σίγουρα αφού κλείσεις το πρόγραμμά σου).

    Αυτό που λες για το scope των μεταβλητών, είναι ακριβώς το ίδιο με την Java, C#! Όπως και εκεί κάθε φορά που τελειώνει ένα block αυτόματα καταστρέφονται οι μεταβλητές που ορίστηκαν μέσα σε αυτό. Όπως και στις άλλες γλώσσες θα καταστραφούν τόσο οι απλές μεταβλητές (int, float, MyClass κτλ) όσο και οι δείκτες (int*, float*, MyClass*).
    Η C++ επειδή δεν έχει garbage collector δεν θα ψάξει ποτέ να βρει ότι δεν υπάρχει reference σε κάποια θέση που έχει δεσμέυσει οπότε δεν θα πάει ποτέ να το αποδεσμεύσει! Οπότε θα έχεις ένα δεσμευμένο χώρο στη μνήμη (μέσω της new) για τον οποίο όμως δεν θα έχεις κανένα Pointer οπότε δεν θα μπορέσεις ποτέ να τον αποδεσμέυσεις!

    Γενικότερα πρέπει να θυμάσαι ότι για κάθε new πρέπει να υπάρχει και ένα delete το οποίο θα εκτελείται! Το ίδιο ισχύει και για τις δομές δεδομένων. Αν τις φτιάξεις ή τις χρησιμοποιείς με δείκτες τότε να φροντίσεις να τις αποδεσμεύεις κιόλας! Αν τις χρησιμοποιείς σαν MyClass x; τότε την αποδεσμεύει η c++ μόλις βγει εκτός scope!

    Αν έχεις μάθε c σε γενικές γραμμές δεν έχεις τίποτα να φοβάσαι (τουλάχιστον στο κομμάτι μνήμης). Ότι δεσμεύεις το αποδεσμεύεις και τέλος! Απλά θα μάθεις λίγο την διαφορετική σύνταξη της C++, δλδ Classes, References, Overloading!

    Ελπίζω να σε βοήθησα και να μην σε μπέρδεψα χειρότερα !
    Με βοήθησες πάρα πολύ! Επειδή από χθες το έψαχνα και λίγο μόνος μου έχω καταλάβει τη παίζει. Ένα πράμα που είδα και μου έκανε εντύπωση
    είναι το εξής:

    Καλό είναι με την c++ 11 να χρησιμοποιώ smart pointers και όχι απλούς pointers.
    Λένε ότι όταν έχω έναν pointer απλό της c++ τότε μπορεί να με πετάξει κάποιο exception και
    να αφήσει κάτι που το λένε leak νομίζω (θα ήθελα να μου το εξηγήσεις λίγο αυτό), επομένως
    αν αργότερα έχω κάποιο delete δεν θα δουλέψει;

    Ενώ οι smart pointers κάνουν αυτόματα delete όταν το πρόγραμμα φύγει από το scope στο οποίο έχουν οριστεί
    και διαχειρίζονται αυτόματα όποιο exception προκληθεί.

    Επίσης ο destructor είναι κάτι που δεν το ήξερα καν. Δεν ξέρω αν υπάρχει στην java κιόλας.
    O destructor καλείτε όταν τελειώσει το πρόγραμμα ή όταν η εκτέλεση του προγράμματος φύγει
    από το scope στο οποίο έχει οριστεί το αντικείμενο;

    Επίσης αυτό :
    Κώδικας:
    Class_name obj_name = new Class_name ();
    διαφέρει στο πότε καλείται ο destructor από αυτό;
    Κώδικας:
    Class_name obj_name;
    Τελευταία επεξεργασία από το μέλος babaliaris : 15-07-16 στις 12:34.

  4. #4
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.442
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Smart pointers δεν έχω δουλέψει (τώρα τους άκουσα πρώτη φορά) οπότε δεν γνωρίζω να σου πω!

    Αυτό που ισχύει με το leak είναι στην ουσία να μην έχεις τίποτα να δείχνει σε δεσμευμένη μνήμη! Σκέψου το ακόλουθο παράδειγμα:
    Κώδικας:
    void test()
    {
        int a = 5;
        int * x;
        x = new int[5];
    }
    
    int main ()
    { 
        test();
     }
    Μέσα στην main καλείς την test η οποία φτιάχνει την μεταβλητή int a και int* x.
    Καλείται η new η οποία δεσμεύει χώρο για 5 int. Στην συνέχεια η test() ολοκληρώνεται και η c++ αποδεσμεύει την μνήμη των μεταβλητών. Άρα διαγράφεται η μεταβλητή a τύπου int και η μεταβλητή x τύπου int*.
    Διαγράφοντας το a (ή αντίστοιχα κάποιο αντικείμενο ορισμένο με Myclass a; ) αυτόματα διαγράφεται και η μνήμη που έχει δεσμεύσει το αντικείμενο αυτό.
    Διαγράφοντας το x πάλι διαγράφεται η μνήμη που έχει δεσμευτεί ΓΙΑ το int*. Όχι ΑΠΟ το int* !!! Έτσι έχεις δεσμεύσει μνήμη μέσα από το x για την οποία όμως δεν έχεις καμία αναφορά (pointer) για να μπορέσεις να κάνεις delete. Αυτό λέγεται memory leak. Αν έχεις έστω και έναν Pointer να δείχνει σε δυναμικά δεσμευμένη μνήμη τότε δεν αποτελεί leak γιατί μπορείς να κάνεις delete. Το πρόβλημα είναι όταν δεν έχεις κανέναν!

    Deconstructor δεν υπάρχει στις άλλες γλώσσες γιατί δεν μπορείς να ξέρεις πότε θα καταστραφεί το αντικείμενο (όταν αποφασίσει να το μαζέψει ο garbage collector). Στην C++ όμως ο destructor καλείται αυτόματα μόλις γίνει delete ένα δυναμικά δεσμευμένο αντικείμενο (Class_name * obj_name = new Class_name ();) ή όταν βγει out of scope ένα απλά δεσμευμένο αντικείμενο (Class_name obj_name;).

  5. #5
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από MitsakosGR Εμφάνιση μηνυμάτων
    Smart pointers δεν έχω δουλέψει (τώρα τους άκουσα πρώτη φορά) οπότε δεν γνωρίζω να σου πω!

    Αυτό που ισχύει με το leak είναι στην ουσία να μην έχεις τίποτα να δείχνει σε δεσμευμένη μνήμη! Σκέψου το ακόλουθο παράδειγμα:
    Κώδικας:
    void test()
    {
        int a = 5;
        int * x;
        x = new int[5];
    }
    
    int main ()
    { 
        test();
     }
    Μέσα στην main καλείς την test η οποία φτιάχνει την μεταβλητή int a και int* x.
    Καλείται η new η οποία δεσμεύει χώρο για 5 int. Στην συνέχεια η test() ολοκληρώνεται και η c++ αποδεσμεύει την μνήμη των μεταβλητών. Άρα διαγράφεται η μεταβλητή a τύπου int και η μεταβλητή x τύπου int*.
    Διαγράφοντας το a (ή αντίστοιχα κάποιο αντικείμενο ορισμένο με Myclass a; ) αυτόματα διαγράφεται και η μνήμη που έχει δεσμεύσει το αντικείμενο αυτό.
    Διαγράφοντας το x πάλι διαγράφεται η μνήμη που έχει δεσμευτεί ΓΙΑ το int*. Όχι ΑΠΟ το int* !!! Έτσι έχεις δεσμεύσει μνήμη μέσα από το x για την οποία όμως δεν έχεις καμία αναφορά (pointer) για να μπορέσεις να κάνεις delete. Αυτό λέγεται memory leak. Αν έχεις έστω και έναν Pointer να δείχνει σε δυναμικά δεσμευμένη μνήμη τότε δεν αποτελεί leak γιατί μπορείς να κάνεις delete. Το πρόβλημα είναι όταν δεν έχεις κανέναν!

    Deconstructor δεν υπάρχει στις άλλες γλώσσες γιατί δεν μπορείς να ξέρεις πότε θα καταστραφεί το αντικείμενο (όταν αποφασίσει να το μαζέψει ο garbage collector). Στην C++ όμως ο destructor καλείται αυτόματα μόλις γίνει delete ένα δυναμικά δεσμευμένο αντικείμενο (Class_name * obj_name = new Class_name ();) ή όταν βγει out of scope ένα απλά δεσμευμένο αντικείμενο (Class_name obj_name;).
    Πω πραγματικά ευχαριστώ πολύ! Αυτές οι λεπτομέρειες είναι πολύ χρήσιμες και πρέπει να τις ξέρω.
    Εντάξει τώρα πιστεύω είμαι μια χαρά. Διάβασα και έναν άρθρο στο interner που εξηγεί πολύ καλά τις λειτουργίες
    new και delete αλλά και memory leak. Σε συνδυασμό με την απάντησή σου τώρα πιστεύω είμαι μια χαρά.

Παρόμοια Θέματα

  1. Μηνύματα: 5
    Τελευταίο Μήνυμα: 25-09-16, 15:20
  2. False warning από τον Chrome στο blog μου
    Από chek2fire στο φόρουμ Internet, web surfing και online υπηρεσίες
    Μηνύματα: 0
    Τελευταίο Μήνυμα: 13-07-16, 14:52
  3. Μηνύματα: 10
    Τελευταίο Μήνυμα: 28-04-16, 14:45
  4. Προβληματακι σε C στο οποιο δεν μπορω να βρω την λυση.
    Από zaranero στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 24
    Τελευταίο Μήνυμα: 28-01-16, 03:11
  5. Μηνύματα: 35
    Τελευταίο Μήνυμα: 02-09-15, 18:57

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας