2011-05-01 3 views

Répondre

3

Oui, vous voulez utiliser new:

shared_ptr<Node> node(new Node); 

Vous pouvez trouver shared_ptr dans boost, C++ 0x et TR1. Il gérera la désallocation pour vous, vous assurant que vous n'avez pas de fuite de mémoire. Si vous utilisez boost, vous voulez inclure et utiliser boost :: shared_ptr.

+0

merci, quel fichier d'en-tête dois-je inclure? –

+0

si vous utilisez C++ 0x (std :: shared_ptr ), si vous utilisez boost (boost :: shared_ptr ). – Lstor

+0

@Don Lun: TR1 a également shared_ptr. '' et ':: std :: tr1 :: shared_ptr'. Et TR1 est actuellement livré dans de nombreux compilateurs et est entièrement supporté, alors que C++ 0x est généralement considéré comme "expérimental" dans la plupart des compilateurs maintenant. – Omnifarious

4

utilisation nouvelle et ne jetterai est nécessaire:

Node* node = new Node; 

Lorsque vous avez terminé, utilisez la commande delete au lieu de libre pour désaffecter la mémoire:

delete node; 

Cependant, vous recommandons d'utiliser shared_ptr:

#include <memory> 

std::shared_ptr<Node> node(new Node); 

Avec shared_ptr, inutile de supprimer explicitement la structure exemple. Lorsque le noeud est hors de portée, il sera supprimé (s'il n'a pas été partagé, sinon il sera supprimé lorsque le dernier shared_ptr qui pointe vers lui sera hors de portée).

+1

Pour ajouter à cela: garder à l'esprit que 'delete', pas' free', doit être utilisée pour libérer la mémoire allouée avec 'new'. –

+0

Bon point - mis à jour. –

3

Son mieux d'utiliser new parce malloc ne remet pas le constructeur, donc Node ne sera pas « construit » si vous utilisez malloc qui alloue seulement la mémoire requise.

D'autre part, new alloue d'abord la mémoire, puis appelle le constructeur qui est le meilleur.

EDIT:

Si vous utilisez malloc, vous pourriez rencontrer ces problèmes: (doit voir)

Why do I get a segmentation fault when I am trying to insert into a tree*

+0

Si le code vient de C, il n'a probablement pas _have_ un constructeur. –

+0

@Chris: Si c'est C, alors vous n'avez pas 'new' aussi. – Nawaz

+1

Le code provient de _ C. L'OP n'a peut-être pas encore besoin d'un constructeur pour 'Node'. Tous les 'struct's en C++ n'ont pas de constructeurs. –

0

Node *node = new Node;

qui devraient avoir exactement le même effet ici.

2

Vous devriez presque toujours utiliser new au lieu de malloc en C++, en particulier lorsque vous créez des objets non-POD. Parce que new apparaîtra le constructeur approprié de la classe tandis que malloc ne le fera pas. Si constructeur n'est pas appelé pour l'objet nouvellement créé, ce que vous obtenez est un pointeur pointant vers un morceau de courrier indésirable.

Tenir compte exemple suivant:

class MyClass 
{ 
public: 
    vector<int> m_array; 
    void insert(); 
}; 
void check::insert() 
{ 
    MyClass *root = (MyClass*)malloc(sizeof(MyClass)); 

        -- This will crash your program because internal vector object 
        v -- has not been initialized yet 
    root->m_array.push_back(0); 
} 
Questions connexes