Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.06.2016, 15:00

new, delete, realloc

Hey,
ich hätte eine Frage zur Benutzung von new[] und delete[] in Kombination mit realloc().
Ich möchte ein Array der Länge n mit new anlegen. Das Array wird im Destruktor unter Aufruf von delete[] wieder gelöscht. Zur Laufzeit möchte ich dynamisch die Größe des Arrays auf die Länge m (m<n) verändern. Dies tue ich mit realloc(). Nun bin ich mir jedoch nicht sicher, ob new/delete und realloc() miteinander "kompatibel" sind, oder ob ich so irgendwelche Speicherzugriffsfehler provoziere. Ausprobiert habe ich das ganze bereits, es läuft tatsächlich durch. Könnte aber natürlich auch nur ein glücklicher Zufall sein.

LG Kyle

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

12.06.2016, 15:02

Gibt es einen bestimmten Grund dafür, wieso du new und delete nutzt? Was ist dein genauer Anwendungsfall? Code?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

12.06.2016, 15:11

Anders ausgedrückt: Sofern Du mit C++ arbeitest und nicht mit C, solltest Du einfach einen std::vector benutzen und ihm die Arbeit überlassen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

12.06.2016, 15:16

Gibt es einen bestimmten Grund dafür, wieso du new und delete nutzt? Was ist dein genauer Anwendungsfall? Code?


Nein eigentlich gibt es keinen speziellen Grund. Ich könnte auch direkt mit malloc() arbeiten. Wenn beide Arten jedoch äquivalent sind finde ich new einfach schöner zu Benutzen.
Code läuft auf einem Arduino. Die spezielle Methode sieht in etwa wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
char* createJson() {
    int i, n;
    char* mJsonResult;
    
    mJsonResult = new char[size];

   // do some shit with arr

    mJsonResult = (char*)realloc(mJsonResult, n+1);  //n+1<size

    return mJsonResult;
    //delete[] in destructor
}


@BlueCobold: Ja std-lib gibts auf dem Arduino leider nicht, deshalb muss ich zu solch unkonventionellen Methoden greifen.

5

12.06.2016, 15:46

new und malloc unterscheiden schon, die sind nicht äquivalent. Aber Nimelrian wollte sicherlich nicht darauf hinaus, dass du malloc statt new benutzt. ;)
Ob du den Speicher malträtierst, kannst du mit bspw. valgrind super überprüfen, ansonsten hilft dir auch schon der gcc mit den richtigen flags. (z.B. -fsanitize=leak)

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

12.06.2016, 15:52

Nee, ich glaub' Nimelrian wollte eher auf make_unique hinaus. Aber das ist ja ebenfalls vom Tisch.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Zipfelpilz

unregistriert

7

12.06.2016, 17:09

Wikipedia liefert die Antwort:

Zitat

The C++ standard does not specify any relation between new/delete and the C memory allocation routines, but new and delete are typically implemented as wrappers around malloc and free. Mixing the two families of operations, e.g., free'ing new'ly allocated memory or delete'ing malloc'd memory, causes undefined behavior and in practice can lead to various catastrophic results such as failure to release locks and thus deadlock.

Da du ja mit einem Microcontrôleur arbeitest, wäre reines C schon eine Erwägung wert. C++ erzeugt nämlich gerne viel versteckten Code hintenrum, der dann irgendwann nicht mehr auf den Chip passt. ;)

Und noch etwas: Vielleicht kann man einem Reisenden auf dem Weg nach Rom einfach mal eine berechtige Absicht zugestehen und sich Fragen wie "warum nicht Reykjavik?" in Zukunft sparen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Zipfelpilz« (12.06.2016, 17:38) aus folgendem Grund: Rüge an Nimelrian und BlueCobold angefügt!


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

12.06.2016, 19:19

Vielleicht kann man einem Reisenden auf dem Weg nach Rom einfach mal eine berechtige Absicht zugestehen und sich Fragen wie "warum nicht Reykjavik?" in Zukunft sparen.

Gerne spare ich mir sowas, aber solange ich nicht die Gewissheit habe, dass es nicht anders geht, würde ich doch immer zu der Verwendung von modernen C++ Paradigmen raten. Und da hat manuelle Speicherverwaltung selten etwas verloren. Das hier ist wie so häufig ein Fall, in dem durch fehlende Informationen wieder große Ratereien nötig sind.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

12.06.2016, 19:32

new halte ich nicht gerade für ein "modernes C++ Paradigma".

Auf einem Mikrocontroller würde ich an deiner Stelle einfach jede dynamische Allokation sein lassen.
Lege ein statisches Array an und gut ist. Es gibt schließlich keine Programme im Hintergrund oder Paging von Speicher, falls der knapp wird. Den Speicher dynamisch zu allokieren, hat dann eigentlich kaum Vorteile. Dafür bekommst du erst zur Laufzeit mit, wenn der der Speicher ausgeht, hast potentiell Memory Leaks und die Implementierung von new bzw. malloc verbraucht bestimmt auch eine Menge Speicher.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

12.06.2016, 19:40

Ich habe auch mit modernen C++ Paradigma eher das Gegenteil von new gemeint, wie du da etwas anderes rauslesen kannst weiß ich auch nicht :P
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige