new - delete Anfängerfrage?
-
Hi an alle,
ich habe ein grundlegendes Verständisprobleme was new , delete, statische und dynamische Objekte betrifft. Lasst euch in dem Programmausschnitten nicht von der CppUnit Sache stören. Es geht nur ums Prinzip..
Also ich habe ein dynamisches Objekt
m_suiteOfTests,mit new angelegt.
Diese füge ich mitm_testrunner.addTest(m_suiteOfTests )einem Objekt Testrunner hinzu.
Jetzt meine Frage: Eigentlich müsste ich doch die
m_suiteOfTestwieder mit delete aus dem Speicher entfernen, oder? geht aber nicht, weil sie jetzt Teil vom
m_testrunnerist. Es gibt eine Exception. Aber der Testrunner ist wiederum ein statisches Objekt und muss nicht deleted werden, denk ich.
Muss jetzt überhaupt was deleted werden?
Im Header File:
public: CPPUNIT_NS::TestResult m_testresult; CPPUNIT_NS::TestSuite *m_suiteOfTests ; CPPUNIT_NS::TestRunner m_testrunner; CPPUNIT_NS::TestResultCollector m_testcollector; };Im *.cpp File: [code]void CTest_tpmDlg::InitTest() { m_suiteOfTests = new CppUnit::TestSuite( "ChosenTests" ); m_suiteOfTests->addTest(new CppUnit::TestCaller<TDDLI_TestCase>("test1",&TDDLI_TestCase::test1 )); m_suiteOfTests->addTest(new CppUnit::TestCaller<TDDLI_TestCase>("test2",&TDDLI_TestCase::test2 )); m_suiteOfTests->addTest(new CppUnit::TestCaller<TDDLI_TestCase>("test3",&TDDLI_TestCase::test3 )); m_testresult.addListener( &m_testcollector ); CPPUNIT_NS::ExtendedTestListener progress( &m_testcollector, this, m_suiteOfTests->getChildTestCount()); m_testresult.addListener( &progress ); CPPUNIT_NS::TestRunner m_testrunner; m_testrunner.addTest(m_suiteOfTests ); }}
-
Statische Objekte werden nach Abarbeitung der main-Funktion automatisch destruiert. Darum mußt du dich nicht kümmern (allerdings sehe ich nicht, wo in deinem Code irgendetwas als static deklariert wäre).
Was das Objekt angeht, das du an dein CPPUNIT_NS::TestRunner-Objekt übergibst angeht, hängt es eben davon ab, ob du die Verantwortung für das Löschen des Objektes bei der Übergabe an das empfangende Objekt übertragen willst.
Wenn ja (in diesem Fall wohl empfehlenswert), muß der CPPUNIT_NS::TestRunner-Destruktor es freigeben. Wenn nein, mußt du es außerhalb freigeben (wobei du darauf achten mußt, daß es dein CPPUNIT_NS::TestRunner-Objekt danach nicht mehr verwendet).
Übrigens ist dein Code nicht Exception-sicher. Aber ich nehme mal an, da du dich derzeit noch mit new/delete-Problemen herumschlägst, hast du im Moment andere Sorgen.
-
Hallo
ja du must die Instanz elber löschen. Aber erst nachdem dein Programm es nicht mehr braucht. Offenbar machst du das delete, und danach will CTest_tpmDlg noch auf die nun nicht mehr gültige Instanz zugreifen.
Du must nun entscheiden wann du die Instanz nicht mehr brauchst. Wenn nur CTest_tpmDlg die Instanz braucht, sollte auch der Destruktor von CTest_tpmDlg diese wieder löschen.
Wenn aber die Instanz auch ohne/mit mehreren Instanzen von CTest_tpmDlg laufen soll, must du ein anderes Übergeordnetes Objekt finden. Im schlimmsten Fall machst du ein Singleton draus.bis bald
akari
-
danke erst mal. den testrunner code möchte ich nicht verändern, der ist nicht von mir. als ich versucht habe, das suiteOfTests freizugeben, dann gabs eine exception, obwohl ich den testrunner an dieser stelle nicht mehr benutzt habe... komisch
-
Vielleicht gibt testrunner bei der Destruktion suiteOfTests bereits frei? Das sollte eigentlich in der Dokumentation stehen. Ansonsten kannst du mal im Quelltext nachsehen (sofern du ihn zur Verfügung hast).
-
ach so.. ist es nicht so, dass ein objekt das mit new ein dynamisches und eins das so :
CPPUNIT_NS::TestRunner m_testrunner;
instanziert wurde ein statisches ist? ich dachte ich hätte das gelesen. Das Schlüsselwort "Static" wird doch in c++ wie in Java eingesetzt, also Methoden die nur einmal existieren, nicht für jede instanz dieser Klasse.. ihr wisst schon was ich meine

-
Z2 du hast recht. ich habe mal in die sourcen vom testrunner geguckt und da steht :
TestRunner::~TestRunner() { delete m_suite; }reichlich verwirrend..wenn man da nicht die sourcen zur hand hätte.
d.h. ich muss gar nichts machen, weil der testrunner automatisch detructed wird, wenn die methode verlassen wird. dann wird auch automatisch die testsuite gelöscht, wenn mich nicht alles täuscht
-
Z2 du hast recht. ich habe mal in die sourcen vom testrunner geguckt und da steht :
TestRunner::~TestRunner() { delete m_suite; }reichlich verwirrend..wenn man da nicht die sourcen zur hand hätte.
d.h. ich muss gar nichts machen, weil der testrunner automatisch detructed wird, wenn die methode verlassen wird. dann wird auch automatisch die testsuite gelöscht, wenn mich nicht alles täuscht.da lob ich mir doch java

-
AFAIR hat der CppUnit TestRunner die Suite auch nach einem abgeschlossenen Testdurchlauf freigegeben.
Btw: Dir ist schon klar, daß die Zeile
CPPUNIT_NS::TestRunner m_testrunner; in der Init Methode das gleichnamige Klassenmember überdeckt?
-
ja ist schon klar. der programmcode sieht nicht ganz so aus, ich habe das aus unterschiedlichen quellen rauskopiert. vielen dank für eure hilfe