Speicher am Heap in einer Funktion freigeben?
-
Hallo,
wie kann ich einen reservierten Speicher am Heap wieder freigeben, wenn die Reservierung des Speichers in einer Funktion stattfindet?
Der Funktionsaufruf erfolgt unter main.c:
int *pointer_array = array_constructor(input_array_value, input_array_length);
Die Funktion befindet sich in test.c:
int *array_constructor(const int &value, const unsigned int &length) { int *my_array{ 0 }; // Array-pointer my_array = new int[length]; // Speicher am Heap reservieren for (size_t i = 0; i < length; i++) { my_array[i] = value; } return my_array; }
-
mit
delete[]
. Aber warumnew
?@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
int *my_array{ 0 }; // Array-pointer
my_array = new int[length]; // Speicher am Heap reservierenUnd warum initialisieren mit
0
wenn du gleich schreiben könntestint *my_array{ new int[length] };
?
@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
for (size_t i = 0; i < length; i++) { my_array[i] = value; }
Wofür die Schleife und nicht
std::fill()
?
-
Mit new reserviere ich Speicher am Heap. Wenn ich
delete[ ] my_array
in der Funktion anwende, lösche ich den reservierten Speicher am Heap, aber damit auch den Pointer welchen ich als rückgabewert zurück geben möchte. Und unter main.c kann ich auf my_array nicht zugreifen.
-
@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
Und unter main.c kann ich auf my_array nicht zugreifen.
Du gibst den wert von
my_array
zurück und speicherst ihn in@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
int *pointer_array = array_constructor(input_array_value, input_array_length);
pointer_array
. ~>delete[] pointer_array;
Nochmal: WARUM
new
??
-
Das Vorhaben selbst ist schon nicht gut. Nimm std::vector<int> und alles wird gut:
#include <vector> int main() { int value = 815; std::size_t length = 4711; std::vector<int> my_data( 4711, 815 ); int* data_ptr = my_data.data(); }
Die Übergabe von
int
undunsigned int
als (const) Referenz macht keinen Sinn. Sofern sie nicht als Out-Parameter benutzt werden übergibt man atomare Datentypen in den allermeisten Fällen als Kopie. Hier gibt´s keinen Grund für eine Ausnahme.
-
@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
std::vector<int> array_constructor(const int &value, const unsigned int &length) { std::vector<int> v( length, value ); return v; }
-
@manni66 sagte in Speicher am Heap in einer Funktion freigeben?:
unsigned int
std::size_t
ftw.#include <cstddef> #include <vector> auto foo(int value, std::size_t length) { return std::vector<int>(length, value); }
Und das Übliche: Ein Pointer ist kein Array. Ein Array ist kein Pointer.
-
This post is deleted!
-
@Swordfish
auf deine Frage: WARUM new??Nun so habe ich es gelernt. Mit new wird Speicher am Heap freigegeben. Ist dem nicht so?
-
@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
Mit new wird Speicher am Heap freigegeben.
Ne, mit
new
wird Speicher reserviert, mitdelete
wieder freigegeben. In modernem C++-Code sollte aber beides nicht mehr auftauchen.
-
@Swordfish
Sorry, hab mich vertan. Ich meinte reserviert...
Ich bin gerade dabei C++ zu lernen, daher spiele ich derzeit mit Arrays bzw. Array-Pointern herum.
-
@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
Ich bin gerade dabei C++ zu lernen, daher spiele ich derzeit mit Array herum.
In deinem Code ist kein Array.
-
@Swordfish sagte in Speicher am Heap in einer Funktion freigeben?:
Ne, mit
new
wird Speicher reserviert, mitdelete
wieder freigegeben. In modernem C++-Code sollte aber beides nicht mehr auftauchen.Und auch in unmordernem C++ nicht. Eine der Hauptmotivationen für das Design von C++ war, die unsägliche manuelle Ressourcenverwaltung von C loszuwerden. Bloß haben dann viele schlechte Lehrer C in C++ programmiert (wenn ich printf mit cout ersetze und malloc mit new ist das doch C++?) und das auch noch weitergegeben. Offenbar auch heute noch.
-
@SeppJ sagte in Speicher am Heap in einer Funktion freigeben?:
wenn ich printf mit cout ersetze und malloc mit new ist das doch C++?
Tu die ++ weg.
-
@ledi001 sagte in Speicher am Heap in einer Funktion freigeben?:
Ich bin gerade dabei C++ zu lernen, daher spiele ich derzeit mit Arrays bzw. Array-Pointern herum.
Spiele lieber mit
std::vector
herum! Schau mal hier: https://en.cppreference.com/w/cpp/container/vector
Ein Pointer ist ein Pointer und kein Array.
Ein Array ist ein Array und kein Pointer.
Ein Array kann automatisch in einen Pointer zerfallen (konvertiert werden). Umgekehrt nicht.
-
Und selbst wenn man keinen
std::vector
möchte, würde man keinen rohen Zeiger nehmen:#include <cstddef> #include <memory> #include <algorithm> auto foo(int value, std::size_t length) { auto bar{ std::make_unique<int[]>(length) }; std::fill(bar.get(), bar.get() + length, value); return bar; }
Aber wahrscheinlich die Parameter umdrehen und ein Default vorgeben:
#include <cstddef> #include <memory> #include <algorithm> template<typename T> auto foo(std::size_t length, T value = T{}) { auto bar{ std::make_unique<T[]>(length) }; std::fill(bar.get(), bar.get() + length, value); return bar; }
`
-
@SeppJ sagte in Speicher am Heap in einer Funktion freigeben?:
Und auch in unmordernem C++ nicht. Eine der Hauptmotivationen für das Design von C++ war, die unsägliche manuelle Ressourcenverwaltung von C loszuwerden.
Das ist historisch falsch. Die STL wurde erst relativ spät kreiert und wurde dann erst mit C++ 1998 Teil der Sprache. Die Verwendung von new und delete waren also vor C++ 1998 der Standard und nicht die Ausnahme. Da aber die Autopointer Klasse in C++ 1998 kaputt war, musste man noch viele Jahre auf die Verwaltung Resourcen in den eigenen Klassen setzen. Erst das Boost Projekt hat kann funktionierende Smart Pointer geliefert, die dann erst mit C++ 2011 Teil der Sprache wurden.
-
@john-0 sagte in Speicher am Heap in einer Funktion freigeben?:
@SeppJ sagte in Speicher am Heap in einer Funktion freigeben?:
Und auch in unmordernem C++ nicht. Eine der Hauptmotivationen für das Design von C++ war, die unsägliche manuelle Ressourcenverwaltung von C loszuwerden.
Das ist historisch falsch. Die STL wurde erst relativ spät kreiert und wurde dann erst mit C++ 1998 Teil der Sprache. Die Verwendung von new und delete waren also vor C++ 1998 der Standard und nicht die Ausnahme. Da aber die Autopointer Klasse in C++ 1998 kaputt war, musste man noch viele Jahre auf die Verwaltung Resourcen in den eigenen Klassen setzen. Erst das Boost Projekt hat kann funktionierende Smart Pointer geliefert, die dann erst mit C++ 2011 Teil der Sprache wurden.
Und was haben STL und Autopointer damit zu tun? Lies dir die Interviews mit Stroustrup durch, bevor du hier anderen historische Fälschung vorwirfst. Alleine die Möglichkeit, das man in C++ die STL und Autopointer haben kann, zeigt dass die automatischen Destruktoren essentieller Teil des Sprachdesigns sind.
-
@Swordfish sagte in Speicher am Heap in einer Funktion freigeben?:
std::size_t
ftw....wohl eher ein Designfehler in der C++ Standard Bibliothek :o)
-
@HarteWare Da scheiden sich die Meinungen der Geister.