PDA

Visualizza la versione completa : [c++]Smart Pointers


giuseppe500
07-03-2010, 16:48
ciao.
Ho un programma del tipo:

for i= 0 to 10{
m_smartptrX = new X();//inizializzo lo smart pointer
Load(X);//carico i dati i = n
Use(X);//uso i dati
}


penso che sia qui il problema:
come posso utilizzare lo stesso smart pointer per caricare piu volte dei dati e soprattutto in questo caso come quando cancellarlo??

Grazie.

MItaly
07-03-2010, 17:47
Dichiara m_smartptrX all'interno del for; in questo modo avrà scope limitato al for e verrà distrutto e ricostruito correttamente ad ogni iterazione.

antotan
07-03-2010, 18:17
Potrei aver capito male, ma credo che lui voglia utilizzare un solo smart pointer dichiarato all'esterno dal for e non sa come fare, dato che:



m_smartptr X = new X() // X di tipo m_smartptr


non funziona.

Se così fosse, devi controllare l'interfaccia dello smartptr. Ad esempio, per le boost:



#include <iostream>
#include <boost/scoped_ptr.hpp>

using namespace boost;
using namespace std;

class T
{
public:
T(int x) : x_(x) { cout << "T::T(int)" << endl; }
~T() { cout << "T::~T()" << endl; }
int getX(){ return this->x_; }
private:
int x_;
};

int main()
{
scoped_ptr<T> ptr;

for(int i = 0; i < 10; i++)
{
ptr.reset(new T(i));
cout << "Val: " << ptr->getX() << endl;
}
}


Scusate se invece ho capito male la domanda.

MItaly
07-03-2010, 18:19
Be', ma se il lifetime degli oggetti che verranno puntati dallo smart pointer deve essere limitato alla singola iterazione del for non ha senso che lo smart pointer sia definito fuori.

antotan
07-03-2010, 18:29
Si si, infatti io userei il smart ptr all'interno del for. Rispondevo solo alla domanda. :)

:ciauz:

giuseppe500
08-03-2010, 09:54
grazie mille.
Il problema è che lo smat pointer va dichiarato fuori dal for e piu precisamente come variabile membro di classe perchè viene utilizzata da molte altre funzioni e deve essere letta da fuori della classe che la contiene.
Il problema è che non voglio sovrascriverlo , perchè se no mi trovo dei memory leak.
O sbaglio?
grazie.

MItaly
08-03-2010, 09:57
La questione mi risulta poco chiara... se è un membro pubblico, che senso ha continuare a cambiarlo all'interno di un ciclo in un metodo della classe? Tanto nel frattempo nessun altro potrà accedervi (salvo multithreading); inoltre, non è chiaro il lifetime che devono avere gli oggetti che crei nel ciclo. Insomma, chiarisci un pelo la questione.

giuseppe500
08-03-2010, 13:52
si ,scusa Mitaly hai ragione.
Il ciclo for l'ho inserito semplicemente per chiarezza e alla fine ha fatto confusione.
Ho una serie di funzioni che agiscono su una variabile di classe smartpointer.
QUesto smartpointer è un vertexbuffer(un buffer) che viene caricato dalle funzioni dentro un ciclo per n volte:
in pseudocodice:


smartpointer<Vertexb*>

private void setVertex()
{ .
.
.
smartpointer.add(xxx)
}
private void setTexture()
{ .
.
.
smartpointer.add(xxx)
}


for (int n= 0 ; n < meshes.count; n++)
{
cancello lo smartpointer// come????? si cancella da solo?
//lo rialloco
smartpointer = new smartpointer<Vertexb*>
//lo riempio
setVertex();
setTexture();

//uso il vertexbuffer(lo smartpointer)

}


grazie.

MItaly
08-03-2010, 18:55
Ribadisco, visto che da quanto ho capito il lifetime di questi oggetti è limitato al ciclo for lo smart pointer dovrebbe essere dichiarato nel ciclo for, così che si occupi automaticamente di distruggere l'istanza creata ad ogni iterazione. Non capisco perché lo dichiari a livello di classe: piuttosto passa alle funzioni che lo manipolano un puntatore ad esso.

giuseppe500
10-03-2010, 21:12
grazie Mitaly.
ma
in pratica il problema di fondo riassumendolo è questo:
ho dichiarato uno smartpointer all' interno di un while:
[code]
while(3 volte){
Wm4::LightPtr spkALight = WM4_NEW Wm4::Light(Wm4::Light::LT_SPOT);
spkALight->DVector = Vector3f(-1.0f,-1.0f,-5.0f);
spkALight->Ambient = ColorRGB(0,0,0);
spkALight->Diffuse = ColorRGB(0.413131,0,1);
spkALight->Intensity = 12;
spkALight->Position = Vector3f(1.0f,1.0f,35.0f);
}
[code]

in questo modo mi da 2 memory leack.
Devo cancellare lo smart pointer prima di ricrearlo?
ad es:

[code]
Wm4::LightPtr spkALight = NULL;
while(3 volte){
delete spkALight;
LightPtr spkALight = WM4_NEW Wm4::Light(Wm4::Light::LT_SPOT);
spkALight->DVector = Vector3f(-1.0f,-1.0f,-5.0f);
spkALight->Ambient = ColorRGB(0,0,0);
spkALight->Diffuse = ColorRGB(0.413131,0,1);
spkALight->Intensity = 12;
spkALight->Position = Vector3f(1.0f,1.0f,35.0f);

objMesh.Light = spkAlight
}
[code]
Il problema è che se spkAlight è gia stato assegnato a qualcosa altro(ad es una classe diversa mesh che lo ha come proprieta) si perde il suo riferimento
e questo non lo voglio.
Quando cancellarlo ? :dhò:
potrei dichiarare lo smartpointer fuori dal while , ma il problema è che ogni volta che viene ricreato va sopra alla memoria di prima (o no?) e questo crea un memory leack.

Voi come fareste?
grazie

Loading