impossible de supprimer std::vector & std::array?
Ma classe C++ est un destructeur qui essaie de supprimer std::vector et std::array variables d'instance.
#include <iostream>
#include <vector>
#include <array>
int main()
{
std::array<int, 3> foo;
std::vector< std::array<float, 4> > vertices;
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
std::cout << foo[0] << std::endl;
delete foo;
delete vertices;
return 0;
}
Je ne suis pas sûr de comment libérer de la mémoire - comment ne puis-je pas supprimer ces variables?
clang++ -std=c++11 -stdlib=libc++ -Weverything ccc.cpp
ccc.cpp:14:2: error: cannot delete expression of type 'std::array<int, 3>'
delete foo;
^ ~~~
ccc.cpp:15:2: error: cannot delete expression of type 'std::vector<std::array<float, 4>
>'
delete vertices;
^ ~~~~~~~~
ccc.cpp:18:2: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic]
}
^
Vous n'avez pas affecter n'importe quoi avec
même s'ils sont membres de l'instance des variables dans une classe?
Oui, les membres d'une classe n'ont pas caché
Ils ne sont pas membres de la classe dans le code vous montrer. De toute façon, la durée de vie de la non-statique des membres de la classe correspond à celle de l'contenant de l'instance de classe.
Tout d'abord, ce qui se passe "dans une classe" n'en est pas de votre entreprise, pour le dire crûment. La classe elle-même prendra soin de tout, si la classe est bien conçu. Deuxièmement,
new
, pourquoi ne vous vous sentez l'envie de libérer quelque chose avec delete
? Ce sont des variables automatiques - ils sont automatiquement détruits lorsqu'ils passent hors de portée.même s'ils sont membres de l'instance des variables dans une classe?
Oui, les membres d'une classe n'ont pas caché
new
ci-joint.Ils ne sont pas membres de la classe dans le code vous montrer. De toute façon, la durée de vie de la non-statique des membres de la classe correspond à celle de l'contenant de l'instance de classe.
Tout d'abord, ce qui se passe "dans une classe" n'en est pas de votre entreprise, pour le dire crûment. La classe elle-même prendra soin de tout, si la classe est bien conçu. Deuxièmement,
std::array
ne pas allouer de la mémoire dynamiquement "dans une classe". std::vector
n', mais encore une fois, ce n'est pas à vous de vous inquiéter.OriginalL'auteur ejang | 2013-09-22
Vous devez vous connecter pour publier un commentaire.
Supprimer ces variables? Le seul "variables" vous devriez
delete
sont ceux que vous avez alloué parnew
. Avez-vous attribuer quoi que ce soit parnew
dans ce code? Pas de. Alors, arrêtez d'essayer dedelete
quoi que ce soit.Objets
foo
etvertices
sont des objets locaux avec automatique durée de stockage. La mémoire de ces objets est alloué automatiquement et libéré automatiquement. Vous ne pouvez pas le faire vous-même. C'est complètement hors de votre contrôle.Si vous souhaitez contrôler l'allocation de la mémoire manuellement, vous devez créer ces objets dynamiquement, en utilisant
new
. Par exempleCi-dessus va travailler. Mais il n'y a pas de véritable raison d'impliquer la mémoire dynamique dans votre exemple. Il fonctionne parfaitement bien comme il est, avec automatique des objets. Juste arrêter d'essayer de
delete
.delete
s'attend à un pointeur comme argument. Lorsque vous allez allouer des objets à travers desnew
, vous pourrez avoir accès à ces objets par le biais de pointeurs. Ces pointeurs est ce qui vous permettra plus tard de passer àdelete
de détruire ces objets. Dans ce code n'est pas applicable.Je ne suis pas sûr de comprendre votre commentaire. Si
myArray2
a été déclaré commeObject *myArray2[10]
, alors vous pas être capable de fairedelete[] myArray2
.Je me suis rappelé que "delete[] arr;" serait d'appeler le destructeur de chaque objet dans le "arr" et de libérer les. cplusplus.com/reference/new/operator%20delete[] "l'opérateur delete[] est une fonction régulière qui peut être appelé explicitement comme toute autre fonction. Mais en C++, delete[] est un opérateur avec un très spécifique de comportement: Une expression avec delete[] l'opérateur, les premiers appels appropriés destructeurs pour chaque élément de la matrice (si ceux-ci sont d'un type de classe), puis appelle une matrice de la fonction de libération.". Devrait-il être Objet arr[] = new Object[10], à la place de l'Objet* arr[] ?
OriginalL'auteur AnT