2011-09-23 3 views
4

Je suis nouveau à C++ et j'ai quelque chose pas clair:Quelque chose peu claire avec l'opérateur supprimer

#include <iostream> 
using namespace std; 

double* foo(void) 
{ 
    double* b = new double[100]; 
    return b; 
} 

int main() 
{ 
    double* a = foo(); 

    delete [] a; 
    return 0; 
} 

Y at-il quelque chose de mal avec ce code? Je veux dire si la façon dont j'utilise l'opérateur supprimer est correcte? J'affecte le pointeur b qui pointe vers la mémoire allouée dans la fonction foo pour pointer vers un foo extérieur, puis-je libérer de la mémoire au moyen de delete [] a dans main? Je n'ai aucune idée comment le compilateur calcule le nombre d'octets à libérer lors de l'exécution de delete []. Merci

+1

duplication possible de [Comment delete \ [\] "connait-il" la taille du tableau d'opérandes?] (Http://stackoverflow.com/questions/197675/how-does-delete-know-the-size- of-the-operand-array) – Mat

Répondre

5

Le code est correct (bien qu'il ne fasse généralement pas partie d'un programme C++ moderne bien écrit).

Les tableaux alloués dynamiquement sont stockés avec des informations cachées sur leur taille afin que delete[] p connaisse le nombre d'éléments à supprimer.


Si vous êtes curieux de savoir les détails, vous pouvez monter un peu de classe de test et tirer profit des opérateurs de répartition des membres:

struct ArrayMe 
{ 
    static void * operator new[](size_t n) throw(std::bad_alloc) 
    { 
    void * p = ::operator new[](n); 
    std::cout << "new[]ed " << n << " bytes at " << p << "." << std::endl; 
    return p; 
    } 

    static void operator delete[](void * p, std::size_t n) throw() 
    { 
    std::cout << "delete[]ing " << n << " bytes at " << p << "." << std::endl; 
    ::operator delete[](p); 
    } 

    double q; 
}; 

Maintenant dire:

std::cout << "sizeof(ArrayMe) = " << sizeof(ArrayMe) << std::endl; 
ArrayMe * const a = new ArrayMe[10]; 
delete[] a; 
+0

"Les tableaux sont stockés avec des informations cachées sur leur taille": ceci représente les tableaux alloués dynamiquement. – Benoit

+0

@Benoit: Merci, mis à jour! –

+1

Attendez! Avez-vous simplement fourni du code à un débutant C++ qui utilise une spécification d'exception!?! Honte à toi. –

1

Appelez delete [] pour supprimer les tableaux de type C alloués avec operator new []. Delete [] saura combien d'octets ont été alloués par l'opérateur new [].

Appel supprimer pour supprimer les objets alloués avec opérateur nouveau (pas de parenthèses). Jamais, ne les mélange jamais! C'est à dire. n'appelez jamais delete [] sur quelque chose alloué avec operator new, et n'appelez jamais delete sur quelque chose alloué avec operator new [].

Questions connexes