Ungültiger Zeiger auf gelöschtes Array?



  • Hallo,

    ich lerne - mal wieder - C++ nach jahrzente langer Abstinenz und habe ein Problem mit - so meine Vermutung - einem Zeiger auf ein gelöschtes Array.

    Im folgenden Beispiel habe ich eine Funktion "get_Services". Diese soll ein Array von Objekten und deren Anzahl zurückgeben, wobei die Anzahl der Objekte vorher nicht bekannt ist sondern erst innerhalb der Funktion ermittelt wird.

    Nun habe ich mir gedacht dass ich dieser Funktion einfach einen Zeiger übergebe, diese ein Array definiert und zurückgibt und als Rückgabewert die Größe des Arrays zurückgibt.

    int get_Services(CService *pServ);
    

    Nun habe ich bei der Ausführung das Problem dass mein Programm bei der Konsolenausgabe in der For-Schleife - also dem versuchten Zugriff auf ein Arrayelement in main terminiert.

    Ich vermute mal dass nach Beendigung meiner Funktion das in ihr erstellte Array schlicht nicht mehr existiert und mein Zeiger anschliessend ins Nirvana zeigt, was dann beim versuchten Zugriff misslingt, korrekt?

    Frage: Wie löse ich das Problem richtig? Mir ist bekannt dass es mit std::vector hier bessere Alternativen gibt das zu lösen, aber auf diesem Wege ohne vector und Co. muss es doch auch funktionieren, oder liege ich hier total daneben?

    #include <iostream>
    #include <string.h>
    
    class CService
    {
    public:
    	CService();
    	~CService();
    	const char *ServiceName;
    	void set_ServiceName(const char *Name)
    	{
    		ServiceName = Name;
    	}
    private:
    
    };
    
    CService::CService()
    {
    }
    
    CService::~CService()
    {
    }
    
    int get_Services(CService *pServ);
    
    int main()
    {
    
    	CService *pServices = nullptr;
    	get_Services(pServices);
    
    	for (int j = 0; j < 10; j++)
    	{
    		std::cout << "Service #" << j << " has: " << pServices[j].ServiceName << std::endl;
    	}
    }
    
    int get_Services(CService *pServ)
    {
    	pServ = new CService[10];
    	for (int i = 0; i < 10; i++)
    	{
    		CService svc;
    		char *name = "ServiceName";
    		svc.set_ServiceName(name);
    		*(pServ + i) = svc;
    	}
    	return 10;
    }
    


  • wci schrieb:

    ich lerne - mal wieder - C++ nach jahrzente langer Abstinenz und habe ein Problem mit - so meine Vermutung - einem Zeiger auf ein gelöschtes Array.

    Lies ein Buch, welches den aktuellen Standard beinhaltet.

    std::vector ist dein Freund 🙂



  • Du änderst nur die Kopie des Zeigers (call by value <=> call by reference).



  • @manni66: Danke das war der Trick!

    int get_Services(CService *&pServ)
    


  • daddy_felix schrieb:

    wci schrieb:

    ich lerne - mal wieder - C++ nach jahrzente langer Abstinenz und habe ein Problem mit - so meine Vermutung - einem Zeiger auf ein gelöschtes Array.

    👍 Besonders Smarte Zeiger und andere wichtige Dinge aus C++11 solltest du dir anschauen.


Anmelden zum Antworten