2012-04-14 2 views
3

Vor einiger Zeit habe ich einen Quellcode aus dem Internet heruntergeladen. Es gab mehrere malloc-Aufrufe, und danach gab es keine Überprüfung auf NULL. Soweit ich weiß, müssen Sie nach dem Aufruf von malloc nach NULL suchen.Warum suchen einige Benutzer nach dem Aufruf von malloc nicht nach NULL?

Gibt es einen guten Grund, dass jemand nach dem Aufruf von malloc nicht nach NULL sucht? Fehle ich etwas?

+1

Aus diesem Grund sind Ausnahmen übrigens Fehlercodes weit überlegen. – GManNickG

+2

Da gibt es viel wichtigere Dinge, die davor stehen: https://gustedt.wordpress.com/2011/11/05/chasing-a-phantom-checking-the-return-of-malloc/ –

+0

Nur noch ein Stück Informationen: Der in der Frage erwähnte Code wurde von einem Microsoft MVP erstellt. – Victor

Antwort

6

Wie Jens Gustedt in einem Kommentar erwähnt, zu der Zeit gibt einen Fehler zurück Ihr Programm ist wahrscheinlich in einem Haufen Probleme bereits. Macht es Sinn, einen Haufen Fehlerbehandlungscode einzubauen, um mit der Situation fertig zu werden, wenn das Programm wahrscheinlich ohnehin nicht viel tun kann? Für viele Programme ist die Antwort "Nein", für andere ist es sehr wichtig, etwas Passendes zu tun.

können Sie versuchen, Ihr Gedächtnis durch eine einfache ‚malloc-or-die‘ Wrapper-Funktion Zuweisung, die garantiert, dass die Zuweisung erfolgreich ist oder das Programm beenden:

void* m_malloc(size_t size) 
{ 

    void* p; 

    // make sure a size request of `0` doesn't trigger 
    // an error situation needlessly 
    if (size == 0) size = 1; 

    p = malloc(size); 

    if (!p) { 
     // attempt to log the error or whatever 
     abort(); 
    } 

    return p; 
} 

Ein Problem, das man dann in laufen ist, dass Es gibt nicht viel, was du zuverlässig tun kannst, außer vielleicht das Programm zu beenden.Selbst wenn das Problem protokolliert wird, wird wahrscheinlich eine gewisse Speicherzuweisung erforderlich sein, so dass die Protokollierungseinrichtung wahrscheinlich ihre eigenen Probleme hat (es sei denn, Ihr Zuteilungsfehler beruht auf dem Versuch, einen unangemessen großen Speicherblock zuzuweisen).

Sie könnten versuchen, dieses Problem zu lösen, indem Sie früh in Ihrem Programm einen 'fehlersicheren' Block zuweisen, der freigegeben werden kann, wenn Sie das Problem protokollieren müssen (ich denke, es gibt einige Programme, die diese Strategie verwenden). Aber wie viel Arbeit Sie in diese Art der Fehlerbehandlung stecken, hängt von Ihren spezifischen Bedürfnissen ab. Wenn Ihr Programm sicherstellen muss, dass etwas von erheblicher Komplexität ausgeführt wird, wenn malloc() einen Fehler zurückgibt, müssen Sie entsprechende Maßnahmen ergreifen, um sicherzustellen, dass Sie diese Dinge in einer Situation mit sehr wenig Arbeitsspeicher tun können. Im Allgemeinen bedeutet dies zusätzliche Komplexität, und es ist nicht immer die Mühe wert.

3

Sie kümmern sich einfach nicht um unerwartete Abstürze!

Wenn Sie malloc tun, ist es sehr wahrscheinlich, dass Sie etwas sofort speichern werden. Wenn Sie also nicht nach NULL suchen, stürzt das Programm möglicherweise ab, wenn Sie versuchen, etwas dort zu speichern.

Dies ist unwahrscheinlich in kleinen Programmen, in denen malloc kaum ausfällt, wenn kleine Speicherkapazität angefordert wird. Das Malloc gibt also NULL nicht zurück.

Aber es ist in der Regel gut Praxis die NULL check für Malloc auch in kleinen Programmen, meiner Meinung nach.

1

Wenn Sie mehr Speicher benötigen und malloc kann Ihnen nicht mehr geben können Sie etwas dagegen tun?
Ich denke, elegant beenden.
Aber wenn Sie beenden, denke ich, dass sie denken, dass es nicht wirklich wichtig ist, wie Sie beenden (könnte auch abstürzen und vermeiden, was sie denken, wie "Overhead" für Prüfungen auf Null).
Vielleicht war die Funktionalität so, dass sie keinen Bereinigungscode benötigten?
Ich stimme jedoch nicht zu. Sie sollten für NULL auf malloc Rückkehr überprüfen

6

Menschen nicht überprüfen, weil sie faul sind, macht es ihren Code hässlicher, und sie wollen nicht herausfinden, wie man sich von Fehlern überall erholen.

Ich habe gehört, ein paar Programmierer sagen, "Wenn ich nicht malloc einen Block kann das System wird bald bald abstürzen, weil VM voll ist, also warum sollte ich überprüfen zu überprüfen?"

stimme ich nicht zu. Sie sollten nach Fehlern suchen, auch wenn es nur bedeutet, den Fehler zu protokollieren und exit() aufzurufen oder eine Ausnahme auszulösen. Während wir uns auf Systeme mit riesigen Festplatten und ständig ausgelagertem Speicher konzentrierten, hat sich die Branche gewendet und wir haben jetzt Smartphones und Tablets mit begrenztem Arbeitsspeicher und ohne On-Demand-Paging. Sogar auf dem Desktop sind unsere Datensätze so stark gewachsen, dass manchmal malloc fehlschlägt.

Wenn Sie nicht überall zusätzliche Codezeilen hinzufügen möchten, schreiben Sie einfach Ihren eigenen malloc-Ersatz, der malloc aufruft und auf Fehler prüft und ihn anstelle von malloc verwendet.

Verwandte Themen