new und delete in C-Programm
Habe ich den folgenden Algorithmus zu implementieren in C
void *newinc(unsigned int s)
{
//allocate and align storage of size s
//handle failure via exception
//return pointer to storage
}
Habe ich die folgende Implementierung:
void *newinc(unsigned int s)
{
int *p = (int *)malloc(s * sizeof(int));
return p;
}
Glaube ich, der erste und der Letzte Schritt in der erwähnten Algorithmus erreicht wurden, durch das Programm,wie implementiere ich die zweite Zeile im Algorithmus:
//handle Fehler per exception
Ich glaube, dass C-Programm nicht try/catch-Blöcke zum abfangen von Ausnahmen.
- C auch nicht-operator definieren/überlastung...
- Sie scheinen verwirrt zu sein über welche Sprache Sie sprechen wollen. Das ist eine wichtige Entscheidung zu treffen, bevor Sie anfangen zu schreiben-source-code.
- C in Titel -, C++ - in-tag - etwas ist falsch.
- Das Bearbeiten macht es nur noch schlimmer. Welchen Teil von "C keinen operator new" verstehst du nicht? Sie sind mit C++.
- sieht es jetzt gut...sorry für die Verwirrung
- Nein. C++ und C nicht die gleiche Sprache. Sie sind mit C++.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie sicher, dass Sie wollen, eine Implementierung in C, nicht C++? Das folgende ist alles unter der Annahme, dass Sie wirklich wollen, C.
Beginnen mit, C kennt nicht das Schlagwort
operator
, und Sie können nicht geben, eine Funktion, die einen Namen mit zwei Wörtern. Sie müssen deshalb geben Sie Ihrer Funktion einen anderen Namen, wieoperator_new
. Gegeben, die Ihre Funktion offensichtlich funktioniert nur für int-Werte (es gibt keinen Weg, der in der Schnittstelle, um Informationen zu geben über die Art, und Ihre Beispiel-Implementierung reserviert Speicherplatz fürs
int
s), würde ich vorschlagen, dassnew_ints
statt (da C keine Konstruktoren, die Unterscheidung zwischennew
undoperator new
ist strittig). Alternativ könnten Sie übergeben möchten, auf Argumente zu sagen über die Größe der Art, die Sie zuweisen möchten. Sie können sogar übergeben Sie einen Zeiger auf eine Funktion, die Sie wollen, aufgerufen werden, als "Konstruktor" für Ihre Objekte (mit einemvoid*
- Schnittstelle).Auch C hat keine Ausnahmen. Können Sie etwas emulieren Sie mit
setjmp
/longjmp
aber da C nicht weiß, Destruktoren wird es nicht tun-Bereinigung für Sie. Code bewusst Ihre hand-made exception-Behandlung können jedoch die Umsetzung der Bereinigung explizit durch eine Kette vonsetjmp
Puffer. Diejenigen allerdings, die setjmp Puffer müssen weitergegeben werden, um Ihre Funktion entweder über zusätzliche Argumente, oder über eine Globale variable. Alles in allem die bessere option in C, nur zurückNULL
alsmalloc
tut. Jedoch, wenn Sie darauf bestehen, auf die Ausnahme ein Teil, das ist, wie Sie es tun (ungetestet):Wäre die Funktion dann wie folgt aufgerufen:
Die typische naive
new
/delete
Implementierungen in C++:In C++11, die exception-Spezifikationen ändern auf "none" für
operator new()
und zunoexcept
füroperator delete()
.Die Erwachsenen-version des
new
Betreiber würde die erste Schleifeset_new_handler()
vor zu werfen.Ausrichtung garantiert Folgen die
malloc()
.const char[N]
? Owch.calloc
stattmalloc
undmemset
. Der Grund dafür ist, dass, wenn neuer Speicher erhalten Sie direkt von der OS (anstelle von derzeit ungenutzten Speicher bereits im Besitz des Prozess), es ist auf null gesetzt, indem das OS sowieso (aus Sicherheitsgründen, denn sonst könnte, wenn die Daten enthalten, die aus einer anderen Anwendung), das macht die explizite clearing überflüssig. Ich würde erwarten, dass eine hochwertige Umsetzungcalloc
um nur den Speicher auf null, selbst wenn nicht schon getan, durch die OS.