Deallocation σε return values

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Deallocation σε return values

Δημοσίευση από lakritidis » 10 Φεβ 2008 12:39

Η παρακάτω function προσπαθεί να μιμηθεί την explode συνάρτηση της php. Δηλαδή παίρνει ως όρισμα ένα string και ένα delimiter και επιστρέφει ένα πίνακα (ένα pointer στο πρώτο στοιχείο του πίνακα δηλαδή) που περιέχει το string διαχωρισμένο από το delimiter.

Κώδικας: Επιλογή όλων

wstring* explode(const wstring& Delimiter, const wstring& OriginalString, int* ArraySize) {
	int Position = 0, NewPosition, i = 0 , count;

	count = CountStringOccurences(Delimiter, OriginalString);
	*ArraySize = count;

	wstring *TempArray = new wstring[count];
	if (Delimiter.length() > 0) {
		for &#40;i = 0; i < count; i++&#41; &#123;
			NewPosition = OriginalString.find&#40;Delimiter, Position&#41;;
			if &#40;NewPosition != -1&#41; &#123;
				TempArray&#91;i&#93; = OriginalString.substr&#40;Position, NewPosition - Position&#41;;
				Position = NewPosition + 1;
			&#125; else &#123;
				TempArray&#91;i&#93; = OriginalString.substr&#40;Position, OriginalString.length&#40;&#41; - NewPosition&#41;;
				break;
			&#125;
		&#125;
	&#125;
	return TempArray;
&#125;
Η CountStringOccurences επιστρέφει το πλήθος (count)των delimiters μέσα στο OriginalString, ώστε να δημιουργηθεί ένας TempArray πίνακας με count στοιχεία.

Κώδικας: Επιλογή όλων

wstring *TempArray = new wstring&#91;count&#93;;
Τον TempArray πώς μπορούμε να τον κάνουμε deallocate (delete [] TempArray) αφού επιστρέφεται από τη function?

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Deallocation σε return values

Δημοσίευση από lakritidis » 10 Φεβ 2008 13:22

Μόλις είδα ένα παράδειγμα όπου το delete συμβαίνει έξω από τη function, από την καλούσα συνάρτηση.

πχ

Κώδικας: Επιλογή όλων

voit test &#40;&#41; &#123;
  int count;
  wstring* str_table;
  str_table = explode&#40;L"-", L"semi-structured", &count&#41;;
  ..
  ..
  delete &#91;&#93; str_table;
&#125;
Είναι νόμιμο αυτό; Εννοώ θα ελευθερωθεί πραγματικά η μνήμη; Πώς σας φαίνεται σαν διαδικασία;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Deallocation σε return values

Δημοσίευση από dva_dev » 11 Φεβ 2008 01:14

Μην σου φαίνεται και πολύ παράξενο. Αντίθετα είναι ένα από τα πιο συνηθισμένα πράγματα.
Οταν στην C καλείς την malloc, τη μνήμη την δεσμεύεις εσύ ή κάποιος άλλος μέσα στην malloc και εσένα σου επιστρέφει έναν pointer στη μνήμη; Οταν καλείς free η μνήμη δεν ελευθερώνεται σε κάποια άλλη function έξω από το πρόγραμμα σου (και σίγουρα όχι εκεί που έγινε το allocation -> malloc).
Στην C++ σε μια κλάση δεν έχει τύχει να δεσμεύσεις μνήμη στον costructor (μια function σχεδόν όπως και οι άλλες), και να την ελευθερώνεις στον destructor (άλλη function από την πρώτη);
Σε γενικές γραμμές πες πως αυτός που χρησιμοποιεί τη μνήμη έχει και την ευθύνη να ξέρει αν (σχεδόν πάντα δηλαδή) και πότε θα την ελευθερώσει.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες