2010-09-10 6 views
1

Possible en double:
Is there any danger in calling free() or delete instead of delete[]?Pouvez-vous mélanger libre et constructeur en C++?

Je lisais cette question:
In what cases do I use malloc vs new?

Quelqu'un a que l'une des raisons d'utiliser malloc était si vous allez utiliser gratuitement.

Je me demandais: est-il valide de mélanger un appel libre et une initialisation de constructeur en C++?

à savoir

Puis-je dire:

my_type *ptr = new my_type; 
free(my_type); 

Est-ce que d'une certaine manière invalide ou pire que:

my_type *ptr = new my_type; 
delete my_type; 

autre que le fait que ce n'est pas C++ ish?

De même, pourriez-vous faire le contraire? Pouvez-vous dire

my_type *ptr = (my_type *)malloc(sizeof(my_type)); 
delete my_type; 

S'il vous plaît fusionner si c'est un double, je cherchais, mais ne vois pas une question dans ces lignes exactement sur malloc/supprimer/nouveau/demandé gratuitement.

+0

Question est un dupe (d'un dupe). http://stackoverflow.com/questions/1612031/is-there-any-danger-in-calling-free-or-delete-instead-of-delete – Serapth

+2

Si vous souhaitez utiliser malloc/free avec des objets C++, vous pouvez utiliser malloc et placement new operator pour appeler un constructeur et ensuite appeler delete, et appeler gratuitement pour libérer la mémoire. Ou créez un allocateur personnalisé, le cas échéant. –

+2

@Vlad: Même après avoir utilisé le placement new, vous ne pouvez toujours pas appeler delete. Mais vous pouvez appeler manuellement le destructeur de l'objet avant d'envoyer la mémoire à libérer. –

Répondre

11

Non, elle n'est pas valide. Il n'y a aucune garantie que new utilisera malloc ou delete utilisera free.

En outre, l'utilisation de free au lieu de delete ignorera le destructeur my_type. Si my_type lui-même contient des ressources, celles-ci seront divulguées. De même, malloc ignorera le constructeur de sorte que la variable puisse être dans un état invalide.

5

Est-il valide de mélanger un appel gratuit et une initialisation de constructeur en C++?

Non, ce n'est pas le cas.

malloc, calloc, realloc -> libre

nouveau -> supprimer

nouveau [] -> supprimer []

2

Non, ce n'est pas valide. malloc (et d'autres fonctions d'allocation C) doivent correspondre à free, new doit correspondre à delete et new [] doit correspondre à delete []. Bien que votre compilateur ne fasse pas nécessairement quelque chose différemment s'il n'y a pas de code destructeur, ce n'est pas quelque chose que vous devriez compter.

La différence principale est que new/delete appelle le constructeur et le destructeur d'un objet; malloc et free le traitent comme une mémoire brute, non typée.

2
  1. free() n'appelle pas le destructeur. Cela libère juste la mémoire, sans poser de questions.

  2. new/delete n'est pas garanti d'utiliser malloc() comme allocateur de mémoire; free peut même pas savoir sur la mémoire que vous lancez

+0

_ @ tdammers_, je pense que le libellé de votre 2ème point est un peu trompeur: Pourquoi devrait-il jamais utiliser? 'malloc' du tout? – stakx

+0

euh, je ne faisais pas attention. Je l'ai réparé. – tdammers

Questions connexes