2017-04-05 2 views
1

bekam ich eine Frage über Zeiger:C++ | Verfahren Umfang Zeigerverwaltungs

class CAppFramework : public IBaseApp 
{ 
public: 
    CAppFramework(std::initializer_list< CClientApp* > input); 
    CAppFramework(); 
    ~CAppFramework(); 

    void Create() override; 
    void Release() override; 

    template< class T > T** Request(std::string c_appname) 
    { 
     for (auto c_app : m_ClientApps) 
     { 
      if (c_app -> GetName() == c_appname) 
      { 
       T** t_app = reinterpret_cast< T** >(c_app); 

       return t_app; 
      } 
     } 

     return nullptr; 
    } 

    std::vector< CClientApp* >& GetClientApps(); 

private: 
    std::vector< CClientApp* > m_ClientApps; 
}; 


void CTest::Create() 
{ 
    std::cout << "Ayye" << std::endl; 

    CTest* test = *(m_Framework->Request<CTest>( 
    "Test")); 
    test -> RunTest(); 
} 

CTest ist eine abgeleitete Klasse von CClientApp.

Muss ich den Test löschen? Denn wenn ich das tue, erhalte ich eine Zugriffsverletzung. Ich nehme an, dass ist, weil "Anfrage" einen Zeiger auf einen Zeiger zurückgibt, der innerhalb eines Vektors ist, also wenn ich es dereference und lösche es, würde es das Objekt im Vektor löschen, der/wird noch verwendet werden?

Dies ist eher eine allgemeine Frage. Muss ich jeden Zeiger oder nur Zeiger löschen, die dynamisch mit "new" zugewiesen werden?

Ich hoffe, dass mir jemand helfen kann.

+0

Wenn Sie 'reinterpret_cast' brauchen, ist in diesem Fall etwas sehr falsch. Können Sie bitte ein [MCVE] angeben? –

+0

Sorry, ich habe es bearbeitet und versucht es verständlich zu machen. – user7814615

Antwort

0

Sie müssen natürlich nicht alle Zeiger löschen, sonst würden Sie Code wie folgt schreiben:

int main(int argc, char ** argv) { 
     // stuff 
     delete argv; 
} 

Wenn Sie ausdrücklich etwas mit new erstellen und zuweisen die Zeiger neu Sie auf einen Rohzeiger gibt , dann müssen Sie delete diesen Zeiger. Natürlich ist dies fehleranfällig und kann nicht ausnahmesicher gemacht werden, und Sie sollten stattdessen Dinge wie std :: unique_ptr und std :: make_unique verwenden.

+0

Das bedeutet also meine Funktion CTest :: Create verursacht keine Speicherlecks? – user7814615

+0

Nicht offensichtlich, aber dann ist es überhaupt nicht offensichtlich, was es macht oder warum es es tut. Wenn Sie Fragen wie diese stellen müssen, glaube ich nicht, dass Sie in der Lage sind, einen Anwendungsrahmen zu entwerfen. –