› Foros › PC › Software libre
Class Imagen{
private:
byte** pixeles;
}
Imagen::Imagen(int h, int w){
pixeles = new byte*[h];
for(int i=0;i<h;i++){
pixeles[i] = new byte[w];
}
}
Imagen::Imagen(){
pixeles = NULL;
}
Imagen::~Imagen(){
if(pixeles != NULL){
for(int i=0;int<h;i++){
delete pixeles[i];
}
delete pixeles;
pixeles = NULL;
}
}
{
Tarari c;
...
} // aquí se destruye automáticamente c
¿Es óptimo pasar el destructor constantemente para liberar memoria? ¿No es mejor pasarlo en función de las necesidades de reutilización de la memoria?
#include <iostream>
#include <tr1/memory>
struct A
{
A() { std::cout << "ctor" << std::endl; }
~A() { std::cout << "dtor" << std::endl; }
void test() const { std::cout << "test" << std::endl; }
};
void f1(const std::tr1::shared_ptr<A> a)
{
a->test();
}
void f2(const A * const a)
{
a->test();
}
int main(int argc, char *argv[])
{
int i(0);
std::cout << i++ << std::endl;
std::tr1::shared_ptr<A> a(new A);
std::cout << i++ << std::endl;
{
std::cout << i++ << std::endl;
std::tr1::shared_ptr<A> aa(a);
std::cout << i++ << std::endl;
f1(aa);
std::cout << i++ << std::endl;
}
std::cout << i++ << std::endl;
f2(a.get());
std::cout << i++ << std::endl;
return 0;
}
std::vector<A *> * v(new std::vector<A *>);
v->push_back(new A);
v->push_back(new A);
v->push_back(new A);
v->push_back(new A);
v->push_back(new A);
// ... usar v y los 'A' que hemos creado
for (std::vector<A *>::iterator i(v->begin()), i_end(v->end()) ; i != i_end ; ++i)
delete *i;
delete v;
std::vector<std::tr1::shared_ptr<A> > v(new std::vector<std::tr1::shared_ptr<A> >);
v->push_back(new A);
v->push_back(new A);
v->push_back(new A);
v->push_back(new A);
// ... usar normalmente v y los 'A' creados
// Ops... se destruye todo automáticamente
Ferdy escribió:¿Es óptimo pasar el destructor constantemente para liberar memoria? ¿No es mejor pasarlo en función de las necesidades de reutilización de la memoria?
Esto no lo entendí, pero me da la sensación de que la respuesta es "Estás muy confundido".
Korso10 escribió:A ver, como norma tendrás que hacer un delete por cada new que uses, si creas un puntero Clase* c = new Clase(), liberas la memoria cuando lo necesites con un delete c y ahí *creo* que no llama al destructor. El destructor se ejecutará automáticamente en caso que la crees como estática y no se vaya a utilizar más.
PrivateJerson escribió:[enfado1] Llevo años sin programar en C++, así que estoy muy desconectado del lenguaje. Por lo que entiendo cuando usas la orden delete sobre un objeto, este se libera de memoria. La pregunta es si es mas óptimo liberar memoria cada vez que se usa una "orden delete", o por el contrario es mas óptimo que cuando se usa una "orden delete" se apunte el objeto como destruible y cuando se necesite memoria se liberen todos los objetos de la lista, como hace por ejemplo el recolector de basura de Java, que pasa cuando le parece y no cuando lo llamas.
Eteream escribió:Korso10 escribió:A ver, como norma tendrás que hacer un delete por cada new que uses, si creas un puntero Clase* c = new Clase(), liberas la memoria cuando lo necesites con un delete c y ahí *creo* que no llama al destructor. El destructor se ejecutará automáticamente en caso que la crees como estática y no se vaya a utilizar más.
No. Por norma general, si el compilador puede determinar la clase que estás destruiendo, si que llama al destructor. En este caso se puede determinar pq el punter es de clase Clase.
No. Por norma general, si el compilador puede determinar la clase que estás destruiendo, si que llama al destructor. En este caso se puede determinar pq el punter es de clase Clase.
Si, después lo pensé bien y es lo más lógico. Lo que me hacía dudar es si la clase no tuviese definido el destructor, ¿que pasa al hacer delete? ¿Se llama a uno genérico? ¿No se destruye?
Ferdy escribió:Si no existe un destructor no se hace nada adicional. Se llevan a cabo las tareas normales como destruir bases y miembros.
- ferdy
Class Imagen{
private:
byte** pixeles;
}
Imagen::Imagen(int h, int w){
pixeles = new byte*[h];
for(int i=0;i<h;i++){
pixeles[i] = new byte[w];
}
}
Korso10 escribió:Ferdy escribió:Si no existe un destructor no se hace nada adicional. Se llevan a cabo las tareas normales como destruir bases y miembros.
- ferdy
Entonces, en la clase que puse antes de ejemplo:Class Imagen{
private:
byte** pixeles;
}Imagen::Imagen(int h, int w){
pixeles = new byte*[h];
for(int i=0;i<h;i++){
pixeles[i] = new byte[w];
}
}
Si yo declarase un objeto Imagen y esta clase no tuviese destructor, ¿que ocurriría exactamente? Por lo que he entendido, ¿se destruiría el puntero pero la memoria seguiría estando reservada?