Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
class A{
     int *a,*b,*c;
  public:
    A();
};
int main(){
   A *t;
  t=new A [5];
 if(t==NULL) exit(1);
 
}

Γεια σας παιδια

Θελω να φτιαξω μια επικαλυψη του τελεστη delete για να απελευθερωνω την μνημη που δεσμευτηκε για τους πινακες a,b,c και για τα 5 αντικειμενα τυπου Α.Την μνημη για τους πινακες την δεσμευω με μια επικαλυψη του τελεστη new.

Δημοσ.

Για όνομα του ο,τι αγαπάς, σε εκλιπαρώ μη χρησιμοποιείς εκφράσεις όπως "επικάλυψη" (πρώτη φορά τη βλέπω, καλά λένε πονάει πάντα η πρώτη φορά) αν ξέρεις τον αντίστοιχο επίσημο όρο. Φαντάζομαι πως εννοείς overload αλλά δε μπορώ να είμαι σίγουρος.

 

 

Αυτός που έβγαλε τον όρο "επικάλυψη" πρέπει να τουφεκιστεί. Γιατί δεν το έλεγες "αναπροσαρμογή" μεγάλε; Το ίδιο εύκολα θα συνεννοηθείς με τον υπόλοιπο πλανήτη.

 

 

Περνώντας στον κώδικα:

  1. Ο τελεστής new δεν επιστρέφει NULL εκτός κι αν το γράψεις σαν new (std::nothrow) A[5], η κανονική του συμπεριφορά αν αποτύχει είναι να κάνει throw ένα std::bac_alloc. Αυτό το γράφουν όλα τα βιβλία.
  2. Δεν δεσμεύεται πουθενά καμία μνήμη για τα a, b, c τα οποία επίσης δεν είναι πίνακες αλλά pointers όπως είναι προφανές από τη δήλωσή τους.
  3. Στη C++ όταν θέλεις να αυτοματοποιήσεις την απελευθέρωση της μνήμης που εκχωρήθηκε σε pointer members ο καλύτερος τρόπος (δηλαδή ο μόνος τρόπος που θα έπρεπε να σκεφτείς δεδομένου πως είσαι αρχάριος) να το κάνεις είναι με τη χρήση του std::unique_ptr smart pointer.
  4. Στην προκειμένη περίπτωση και εφόσον λες "πίνακας", αυτό που χρειάζεσαι δεν είναι ούτε καν smart pointer αλλά ένας std::vector<int> ή std::array<int> (ανάλογα τις λεπτομέρειες). Και οι 2 αυτές κλάσεις διαχειρίζονται αυτόματα τη μνήμη που εκχωρείται για να κρατήσει τα περιεχόμενά τους.
  5. Κανόνας για αρχάριους (που έχει πολλή σχέση με τα παραπάνω): όποτε πιάνεις τον εαυτό σου να γράφει delete, κάτι έχεις κάνει λάθος.

Δώσε μερικές περισσότερες πληροφορίες και κώδικα για να καταλάβουμε τι ακριβώς θέλεις να κάνεις.

  • Like 1
Δημοσ.

Φιλε ασκηση για την C++ ειναι.Κι απ την στιγμη που μου το ζηταει με delete ετσι πρεπει να το κανω.Την μνημη δεν την δεσμευσα πουθενα γιατι δεν εβαλα ολο τον κωδικα(με overload new δεσμευω μνημη για αυτους τους πινακες). Απλα θελω να μου πειτε πως μπορω να αποδεσμευσω την μνημη με overload delete operator.

Δημοσ.

Εμένα προσωπικά όποτε μου έβαζαν ασκήσεις με τέτοιες απαιτήσεις πήγαινα στον καθηγητή και έλεγα "δεν γίνονται έτσι αυτά, να τα κάνω όπως πρέπει?". Δηλαδή αν αύριο έρθει ο εργοδότης σου και σου πει πάρε αυτή την οδοντόβουρτσα και βάψε τον τοίχο τι θα πεις; Τέλος πάντων, δε μας ενδιαφέρει κιόλας στα πλαίσια του forum.

 

Κατά τα άλλα κάτι λείπει, κάτι λείπει...

Δημοσ.

Επικαλυψη = override ?

Α overload θες, στα ελληνικα ειναι υπερφορτωση. Επικαλυψη θα πηγαινε περισσοτερο στο override.Λεω εγω τωρα.

Τεσπα, οπως εκανες το new ετσι θα κανεις και το delete. Λογικα το new το εκανες με malloc αρα και το delete θα το κανεις με free.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...