2017-07-09 9 views
3

Ich kann keinen Weg finden, ein Array ohne dynamische Speicherzuweisung zurückzugeben. Ich werde es im Detail anhand eines Beispiels erklären:
Bei der dynamischen Speicherzuordnung:C++ Rückgabe Array ohne dynamische Speicherzuweisung?

Device* getConnectedDevices() { 
    // scan for devices. 
    Device *connectedDevices = new Device[deviceCount]; // Dynamically allocate memory for the Devices 
    // Get for each device an ID 
    return connectedDevices; 
} 
void doSomething() { 
    // some code 
    // I need a list with all the connected devices!! 
    Device *connectedDevices; 
    connectedDevices = getConnectedDevices(); 
    // do something with the array 
} 

doSomething() nicht wissen, die Größe des Arrays, so habe ich eine Struktur, dieses Problem zu lösen:

struct deviceArray { 
    Device* devices; 
    int deviceCount; 
}; 

Ohne dynamische Speicherzuweisung: ich habe keine Ahnung, wie dies zu tun. Ich habe folgende Dinge ausprobiert:

  • Vorbeilauf. Problem: Wir kennen die Array-Größe vor dem Scannen nicht.
  • Zurück ohne dynamische Speicherzuweisung (lokaler Variable). Problem: Das Objekt existiert nicht mehr (natürlich).
+6

Sie zuteilen nicht alles manuell, in C++ verwenden Sie einfach 'std :: VECTOR' oder ähnliche Klassen. –

+1

das Zurückgeben eines 'lokalen Zeigers' ist immer ein Desaster, da die Adresse beim Beenden der Funktion nicht gültig ist. Daher ist eine dynamische Zuordnung erforderlich. – dlmeetei

+1

'std :: vector' verwendet dynamische Speicherzuweisung. Der Unterschied besteht darin, dass Ihre Funktion den dynamisch zugewiesenen Speicher nicht explizit verwalten muss - ein Vektor verwaltet seinen eigenen Speicher. – Peter

Antwort

9

Im Allgemeinen ist es nicht möglich, so ohne dynamische Speicherzuweisung zu tun.
Die Probleme, die mit dem (den Überblick über die Größe, die richtige Deallokation, etc.) entstehen, sind weit verbreitet.

Diese Probleme, die Sie in C gelöst beschreiben, sind ++ container classes und dynamic memory management smart pointers verwenden.

In Ihrem Fall wäre es angebracht, eine std::vector<Device> zu verwenden, um die Liste der Geräte darzustellen und die Details und Komplikationen der dynamischen Speicherverwaltung vor Ihnen zu verbergen.

3

Sie müssen nicht für diese new alles,

std::vector<Device> getConnectedDevices() 
{ 
    std::vector<Device> devices; 
    // Fill `devices' with devices.push_back() 
    return devices; 
} 

Sie können auf viele verschiedene Arten durch die Liste der Geräte durchlaufen, usng iterators zum Beispiel.

Normalerweise brauchen Sie keine Zeiger auf alle in C++, wenn Sie wissen, wie Referenzen und STL-Container verwenden, können Sie alles tun können Sie ohne einen einzigen Zeiger wollen. Es gibt jedoch Fälle, in denen es Sinn macht, Zeiger zu verwenden, aber ich bezweifle, dass dies einer davon ist.

+0

Adresse wird nicht gültig beim Beenden der Funktion – dlmeetei

+2

@dlmeetei Keine Adresse in diesem Code überhaupt beteiligt. Nur wenn Sie einen Zeiger auf eine lokale Variable zurückgeben, wäre zum Beispiel 'return & devices' ein Problem. –

+0

lokale Variable entsteht beim Eintritt in die Funktion und das Leben ist beim Beenden der Funktion beendet – dlmeetei

Verwandte Themen