2009-07-07 3 views
10

Ich habe oft gehört, dass der Satz von Bjarne Stroustrup "C++ macht es schwieriger, sich in den Fuß zu schießen; aber wenn Sie es tun, nimmt es das ganze Bein" und ich weiß nicht wirklich, ob es ist so schrecklich wie es klingt.Was ist die gefährlichste Eigenschaft von C++?

Was ist das Schlimmste, das Ihnen während der Programmierung in C++ je passiert ist (oder genauer gesagt, Ihrer Software)? Auf welche Weise kann es gefährlicher sein als beispielsweise einfaches C zu sagen?

+3

Immer wenn Sie sich dessen bewusst sind, dass Sie tun, gibt es nichts Gefährliches. Die Waffe in Affenhänden kann immer zu Ärger führen. –

+3

Ja, aber die Banane führt zu viel weniger. –

+0

Ich werde dir keine Antwort geben, aber ich werde dir den denkwürdigsten Rat sagen, den ich jemals über das Thema gehört habe. Das heißt: "Wenn Sie vergessen, eine Ausnahme zu erfassen, wird Ihre gesamte Anwendung beendet!". Aus irgendeinem Grund klang das damals ziemlich bedrohlich für mich. –

Antwort

11
delete [] array; 

kann manchmal

delete array; 

in den Händen von jemandem geworden, der nicht weiß. Diesen Fehler zu verfolgen, kann furchtbar lutschen und passiert nicht, wenn Sie malloc und free machen.

+1

Wie Sie wahrscheinlich wissen, ist es bei malloc und free nicht der Fall, weil hier nicht zwischen einem Array oder einem einzelnen Element unterschieden wird. – Skurmedel

+1

Genau. Also habe ich die "Scheine" -Klausel los; Ich war vorsichtig, weil es schon so lange her ist, dass ich C benutzt habe ... – mmr

+0

Hehe gleich hier :) – Skurmedel

1

Die Implementierung der Ausnahmebehandlung ist ein einfacher Einstieg in Speicherlecks.

+0

Wie so? Denken Sie über den Fall von Ausnahmen nach, die durch Zeiger statt durch Referenz ausgelöst werden? –

+2

Mit richtigen RAII, das ist kein Problem, denke ich –

+0

nicht einverstanden. Ich sehe keinen Grund dafür, dass Erinnerungen mit Ausnahmen durchgesickert sind. Der Standard ist sehr klar, wie die Ausnahme propagiert wird. –

0

ist wohl der gefährlichste Aspekt von C++, die in C existieren nicht die Fähigkeit, Operatoren für komplexe Typen außer Kraft zu setzen. Es kann sehr einfach sein, zum Beispiel Subtraktionsaddition (und umgekehrt) zu machen.

Es ist dumm, dass jemand tun würde das, aber es kann getan werden. Es gefährlich machen.

4

Die Anforderung an virtuelle Destruktoren ist für Neuankömmlinge leicht zu übersehen (obwohl ich denke, dass die meisten Compiler schlau genug sind, dieses Problem zu beseitigen).

+0

Welche virtuelle Destruktor-Anforderung? – ralphtheninja

+0

@Magnus: Wenn Sie ein Objekt über einen Zeiger auf seine Basis (oder einen Vorgänger) zerstören, wird der falsche Destruktor aufgerufen, wenn der Destruktor nicht virtuell ist. Daher sollten Klassen, die überschrieben werden sollen, wahrscheinlich einen virtuellen Destruktor haben. –

2

Operator overloading. Sehr leicht zu verstehen, was vor sich geht. Es ist leicht zu übersehen, dass selbst für erfahrene C++ - Entwickler eine Überlastung vorliegt.

+7

Überladene Operatoren haben ihren Platz. Ich würde nicht sagen, dass das Feature von Natur aus schlecht ist - es kann sehr nützlich sein. Wenn die Leute anfangen, sie zu definieren, um Dinge konterintuitiv zu machen, entstehen die Schwierigkeiten. Überladene Operatoren können, wenn sie richtig verwendet werden, Code einfacher und sauberer machen. –

0

Wenn Sie die Sicherheit von C++ mit C vergleichen, dann haben Sie den Punkt dieser Phrase verpasst. C++ ist wohl nicht sicherer als C.

Wo der Vergleich wirklich gemacht werden kann, ist mit einer Sprache wie Java. Im Wesentlichen behandelt Java Ihren Speicher für Sie, sodass Sie kein undefiniertes Verhalten beim Aufrufen von Speicher außerhalb des Speichers haben, den Ihr Programm gerade verwendet (außerhalb der Grenzen von Arrays usw.).

Um Ihre Frage zu beantworten, war das Schlimmste, was mir passiert ist, ein Pufferüberlauf, um mein eigenes Passwort außer Kraft zu setzen (ich tat es jedoch absichtlich).

+0

Sehr wahr. Die gefährlichsten Aspekte von C++ sind tatsächlich Überbleibsel von C. Es gibt ein paar Features in C++, die nicht in C existieren (wie das Überladen von Operatoren); Ich glaube, dass die Frage danach fragt. – Randolpho

+0

Tatsächlich kann die statische Typprüfung in C++ strenger durchgesetzt werden als in C, denke ich (die Typedefs sind am Ende so etwas wie "alles geht") – fortran

+2

C++ gibt Ihnen die Wahl, Sie können überprüfte Arraygrenzen verwenden, wenn Sie möchten - aber Sie müssen nicht (und zahlen die Leistung Strafe), wenn Sie nicht müssen –

0

Ich habe mich immer über dieses Zitat gewundert. Ich kann mir nicht vorstellen, dass C++ mehr als gefährlich ist.

In jedem Fall muss ich sagen, das gefährlichste "Feature" ist, dass es nichts gibt, das Sie daran hindert, auf nicht zugeordneten Speicher zuzugreifen. Es ist ein Fehler, der fast unmöglich zu debuggen ist, verursacht alle Arten von zufälligem Verhalten, von Abstürzen bis zu nichts, nur zu merkwürdigem Verhalten.

2

Ich übergab diese an eine Hilfsfunktion in einem anderen Objekt von einem Konstruktor. Die Hilfsfunktion fügte den Zeiger zu einer Liste von Objekten hinzu, die er pflegte.Nachdem der Konstruktor fertiggestellt und zurückgegeben wurde, befand sich das Objekt natürlich an einer anderen Stelle im Speicher und der im anderen Objekt gespeicherte Zeiger war nicht mehr gültig. Huch!

+0

Ist das wahr? : - | – fortran

+2

Es ist nie sicher, "das" aus einem Konstruktor zu verlieren. Insbesondere nicht in einer Multithread-Umgebung, in welchem ​​Fall das Objekt teilweise konstruiert oder nur teilweise sichtbar ist. Es kann nicht angenommen werden, dass Objekte vollständig konstruiert sind, bevor der Konstruktor zurückgegeben wurde (dies gilt auch für Java und C#). –

+0

Klingt, als hättest du einen Fehler gehabt. –

0
  • Betreiber Überlastung, wenn nicht korrekt
  • Mehrfachvererbung (leicht zu missbrauchen) implementiert
  • Pufferüberlauf
2

ich hätte sagen automatische Typumwandlung. C++ kann temporäre Variablen auf nicht intuitive Weise durch automatische Typkonvertierung erstellen.

Verwandte Themen