Frage

Ich habe ein altes Programm, in dem einige Bibliotheksfunktion verwendet wird und ich nicht, dass die Bibliothek haben.

So schreibe ich, dass die Programmbibliotheken von C ++. In diesem alten Code ist eine Funktion gibt, die wie folgt genannt wird

* string = newstrdup ( "Some String geht hier");

die String-Variable wird als char deklariert ** string;

Was er auch sein mag in dieser Funktion mit dem Namen „newstrdup“ zu tun? Ich habe versucht, viele Dinge, aber ich weiß nicht, was er tut ... Kann mir jemand helfen

War es hilfreich?

Lösung

muss es ein Grund sein, dass sie eine „neue“ Version von strdup schrieben. Es muss also eine Ecke sein, dass sie anders behandelt. wie vielleicht ein Null-String einen leeren String zurück.

litb Antwort ist ein Ersatz für strdup , aber ich würde denken, es ist ein Grund, warum sie taten, was sie taten.

Wenn Sie direkt verwenden strdup möchten, verwenden Sie einen definieren sie umbenennen, anstatt neue Code zu schreiben.

Andere Tipps

Die Funktion wird verwendet, um eine Kopie von c-Strings zu machen. Das ist oft eine beschreibbare Version einer Stringliteral erhalten benötigt. Sie (Stringliterale) sind selbst nicht beschreibbar, so eine solche Funktion kopiert sie in einem zugeordneten beschreibbaren Puffer. Sie können sie dann an Funktionen übergeben, die ihr Argument ändern, wie strtok, die in den String schreibt sie in tokenize hat.

Ich glaube, Sie mit so etwas wie dies oben kommen kann, da sie genannt wird neue strdup :

char * newstrdup(char const* str) {
    char *c = new char[std::strlen(str) + 1];
    std::strcpy(c, str);
    return c;
}

Sie sollte wäre es einmal frei gemacht mit dem String mit

delete[] *string;

Eine alternative Art und Weise des Schreibens es malloc verwendet. Wenn die Bibliothek alt ist, es verwendet hat, dass die C ++ von C geerbt:

char * newstrdup(char const* str) {
    char *c = (char*) malloc(std::strlen(str) + 1);
    if(c != NULL) {
        std::strcpy(c, str);
    }
    return c;
}

Nun, Sie sollen die Zeichenfolge mit free befreien, wenn Sie fertig:

free(*string);

Ziehe die erste Version, wenn Sie mit C ++ schreiben. Aber wenn der vorhandene Code free verwendet wieder den Speicher freizugeben, verwenden Sie die zweite Version. Beachten Sie, dass die zweite Version gibt NULL wenn kein Speicher für dup'ing die Zeichenfolge zur Verfügung steht, während die erste eine Ausnahme in diesem Fall wirft. Noch ein Hinweis soll über das Verhalten genommen werden, wenn Sie ein NULL Argument zu Ihrem newstrdup passieren. Je nach Ihrer Bibliothek, die erlaubt sein kann oder auch nicht zugelassen werden. So legen Sie müssen geeignete Kontrollen in den oben genannten Funktionen, wenn. Es gibt eine Funktion strdup in POSIX-Systemen genannt, sondern dass man erlaubt weder NULL Argumente noch verwendet es den C++ Operator neue Speicher zuzuweisen.

Wie auch immer, ich habe mit Google Codesearch für newstrdup Funktionen gesucht und gefunden ziemlich viele. Vielleicht ist Ihre Bibliothek unter den Ergebnissen ist:

Google Codesearch, newstrdup

Die Linie *string = newstrdup("Some string goes here"); zeigt keine Seltsamkeit newstrdup. Wenn string hat Typ char ** dann newstrdup gerade Rückkehr char * wie erwartet. Vermutlich wurde string bereits auf eine Variable vom Typ char * hinweisen, in dem das Ergebnis zu platzieren ist. Andernfalls wird der Code durch einen nicht initialisierten Zeiger schreibt ..

newstrdup wird wahrscheinlich macht eine neue Zeichenfolge, die ein Duplikat des übergebenen String ist; es gibt einen Zeiger auf den String (die sich auf die Zeichen ein spitzer ist).

Es sieht aus, als habe er eine strdup () Funktion geschrieben auf einem vorhandenen Zeiger zu arbeiten, wahrscheinlich Neuzuweisung es zu einer neuen Größe und seinen Inhalt füllen. Wahrscheinlich ist er dies tut den gleichen Zeiger in einer Schleife wieder zu verwenden, wo * string häufig ändern wird, während bei jedem nachfolgenden Aufruf ein Leck verhindert strdup ().

Ich würde wahrscheinlich, dass wie string = redup (& string "neue Inhalte") implementieren .. aber das ist nur meine Meinung.

Bearbeiten :

Hier ist ein Schnipsel meines ‚redup‘ Funktion, die etwas Ähnliches zu tun könnte, was Sie auf dem Laufenden, nur in einer anderen Art und Weise:

int redup(char **s1, const char *s2)
{
    size_t len, size;

    if (s2 == NULL)
        return -1;

    len = strlen(s2);
    size = len + 1;

    *s1 = realloc(*s1, size);

    if (*s1 == NULL)
        return -1;

    memset(*s1, 0, size);
    memcpy(*s1, s2, len);

    return len;
}

Natürlich, ich soll wohl eine Kopie * s1 speichern und wiederherstellen, wenn realloc () fehlschlägt, aber ich brauchte nicht so paranoid zu erhalten.

Ich glaube, Sie brauchen, zu betrachten, was mit dem „string“ Variable im Code als Prototyp für die newstrdup () Funktion identisch mit der Bibliothek strdup zu sein scheinen, geschieht () Version.

Gibt es frei (* string) ruft im Code?

Es scheint eine seltsame Sache zu tun zu sein, es sei denn, es intern ist eine Kopie der duplizierten String zu halten und einen Zeiger zurück auf die gleiche Zeichenfolge Rückkehr wieder.

Noch einmal, ich würde fragen, warum?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top