2014-07-23 5 views
0

Question très simple, mais je n'ai pas trouvé de réponse: les 2 expressions suivantes sont-elles équivalentes en C++ en termes d'allocation de mémoire?Allocation de mémoire C++ pour les tableaux

wchar_t wide_array[10]; 
wchar_t* ptr_wide_array = new wchar_t[10]; 

Donc, je voudrais savoir: dois-je toujours supprimer le tableau, peu importe comment je l'initialise? Ou puis-je en quelque sorte bénéficier de la portée et produire des tableaux sur la pile qui meurent simplement sans appeler explicitement delete, car ils sortent de la portée. Et bien sûr cela vaut-il la peine d'utiliser la portée si possible ou est-il plus sûr d'utiliser toujours la suppression?

+4

duplication possible de [tableau statique C++ vs tableau dynamique?] (Http://stackoverflow.com/questions/2672085/c-static-array-vs-dynamic-array) – CoryKramer

+1

Non, non et oui. Lire un livre d'introduction. Il y a une bonne liste ici: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – juanchopanza

+1

Mais pourquoi ne pas utiliser [std :: wstring] (http: //www.cplusplus .com/reference/string/wstring /) au lieu d'un tableau? – crashmstr

Répondre

1

En C/C++, un tableau se décompose facilement [#] en un pointeur vers son premier élément. Donc *wide_array et wide_array[0] sont la même chose. En fait, wide_array[i] est en fait défini comme (ou, si vous préférez, est le sucre syntaxique pour) (wide_array + i). Tellement que i[wide_array] signifie la même chose que wide_array[i], ce qui est une façon amusante d'obscurcir le code C/C++ (mais jamais le faire!).

Ainsi votre deuxième exemple peut également être référencé comme ptr_wide_array[i].

C'est aussi loin que la syntaxe va. Maintenant, quant à ce qui se passe sous le capot:

La différence entre vos deux exemples est que the first is allocated on the stack, the second on the heap. Cela implique que le premier sera automatiquement désaffecté une fois qu'il est hors de portée, mais le second ne sera pas désaffecté tant que delete[] ptr_wide_array ne sera pas appelé (ou sur un autre pointeur copié de ptr_wide_array). Cela entraîne un risque sérieux de fuite de mémoire, en particulier si vous commencez à utiliser des exceptions. En général, n'utilisez pas un new brut en C/C++. Utilisez des conteneurs tels que std::vector et smart pointers.

[#] Voir this SO question pour une explication de la façon dont les tableaux et les pointeurs sont liés et comment les tableaux "se désintègrent" en pointeurs.

+0

Merci, bonne réponse. Pouvez-vous expliquer pourquoi une adresse de tas est affichée à côté du premier exemple dans le débogueur? Voir mon dernier commentaire sous la poste. – Sesertin

+0

@Sesertin C'est juste une adresse. La pile existe dans la carte mémoire du processeur, tout comme le tas, de sorte que les objets qui se trouvent sur la pile ont des adresses, tout comme les objets du tas. – alastair

+1

Non, un tableau n'est pas un pointeur sur le premier élément, du moins pas en C++. C'est une idée fausse qui mène à beaucoup de problèmes. – juanchopanza