130 votes

Créer un objet: avec ou sans `new`

Double Possible:
Quelle est la différence entre l'instanciation d'un objet à l'aide de nouveaux vs sans

C'est probablement une question de base, et peut-être déjà été demandé (par exemple, ici); mais je ne comprends toujours pas. Alors, permettez-moi de demander.

Considérez les points suivants de la classe C++:

class Obj{
    char* str;
public:
    Obj(char* s){
        str = s;
        cout << str;
    }
    ~Obj(){
        cout << "Done!\n";
        delete str;        // See the comment of "Loki Astari" below on why this line of code is bad practice
    }
};

quelle est la différence entre les extraits de code suivants:

Obj o1 ("Hi\n");

et

Obj* o2 = new Obj("Hi\n");

Pourquoi l'ancien appelle le destructeur, mais ce dernier n'a pas (sans appel explicite à l' destroy)?

Qui est préférée?

150voto

Lightness Races in Orbit Points 122793

Les deux font des choses différentes.

La première crée un objet avec automatique de la durée de stockage. Il est créé, utilisé, et puis s'en va hors de portée lorsque le bloc courant ({ ... }) se termine. C'est le moyen le plus simple pour créer un objet, et est le même que lorsque vous écrivez int x = 0;

La seconde crée un objet avec dynamique de la durée de stockage et permet deux choses:

  • Un contrôle plus fin de la durée de vie de l'objet, puisqu'il ne va pas hors de portée automatique: vous devez détruire explicitement en utilisant le mot-clé delete;

  • Création de tableaux avec une taille connue qu'à l'exécution, depuis la création de l'objet se produit lors de l'exécution. (Je ne rentrerai pas dans les détails de l'allocation dynamique de tableaux ici.)

Ni est préféré; il dépend de ce que vous faites, lequel est le plus approprié.

L'utilisation de l'ancienne, sauf si vous devez utiliser celui-ci.

Votre C++ livre devrait couvrir ce assez bien. Si vous n'en avez pas, n'allez pas plus loin jusqu'à ce que vous avez acheté et lu, à plusieurs reprises, l'un de ces.

Bonne chance.


Votre code d'origine est cassé, comme c' deletes - char tableau qu'il n'avait pas new. En fait, rien n' newd de la C-chaîne de style; il est venu à partir d'une chaîne littérale. deleteing qui est une erreur (bien qu'il ne générera pas d'erreur de compilation, mais plutôt un comportement imprévisible au moment de l'exécution).

Souvent un objet ne doit pas avoir la responsabilité de l' deleteing quelque chose qu'il n'a pas lui-même new. Ce comportement doit être bien documenté. Dans ce cas, la règle est complètement brisé.

29voto

Jerry Coffin Points 237758

Le premier alloue un objet avec une durée de stockage automatique, ce qui signifie qu'il sera automatiquement détruit à la sortie de la portée dans laquelle il est défini.

La seconde a alloué un objet avec une durée de stockage dynamique, ce qui signifie qu'il ne sera pas détruit avant que vous n'utilisiez explicitement delete pour le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X