Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [c++]Smart Pointers

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]Smart Pointers

    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.

  2. #2
    Dichiara m_smartptrX all'interno del for; in questo modo avrà scope limitato al for e verrà distrutto e ricostruito correttamente ad ogni iterazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    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:

    codice:
    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:

    codice:
    #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.

  4. #4
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Si si, infatti io userei il smart ptr all'interno del for. Rispondevo solo alla domanda.


  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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.

  7. #7
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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:
    codice:
    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.

  9. #9
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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 ?
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.