jbuffer

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

jbuffer
Morgen :slight_smile:

Was passiert eigentlich, wenn bspw. bbGet() einen ungültigen BNDBUF übergeben bekommt? Gefühlsmäßig hätte ich jetzt -1 oder so zurückgegeben, was aber irgendwo auch doof ist, weil (a) nicht spezifiziert und (b) -1 ja ein normaler Wert im Puffer sein könnte. Also besser ggf. einfach “kaputt gehen lassen”?


Meinst du mit ungültigem [m]BNDBUF[/m] einen [m]NULL[/m]-Zeiger? Auch wenn’s nicht spezifiziert ist, ist es absolut okay und richtig diesen Fall abzufangen und -1 zurückzugeben - aber es ist nicht explizit notwendig.

Zum Vergleich: Wenn du einen [m]NULL[/m]-Zeiger anstelle eines gültigen [m]FILE *[/m] an [m]fprintf()[/m] o. ä. übergibst, wird die libc das auch nicht abfangen, sondern du kriegst einen Segfault.


Ah OK, danke. Dann ist Segfaulten lassen also Standardverhalten :slight_smile:


Quasi. :wink:

Um einen weiteren nicht-hinkenden Vergleich zu bringen: Wenn man in C++ versucht eine Methode auf ein [m]NULL[/m]-Objekt aufzurufen, bekommt man ebenfalls einen Segfault. (In Java bekommt man keinen wilden Segfault, sondern eine kontrollierte und abfangbare [m]NullPointerException[/m], aber Java ist im Gegensatz zu C/C++ eine typsichere Sprache.)


Noch ein Nachtrag: [m]bbDestroy()[/m] soll gemäß der API-Dokumentation mit [m]NULL[/m]-Zeigern umgehen können - es soll in diesem Fall einfach stillschweigend nichts tun anstatt zu versuchen, den Puffer wegzuräumen.


[s]Abend,

jemand Vorschläge worran das liegt wenn bbPut ewig blockt? Die zuständige Semaphore wurde in bbCreate mit semCreate(size) erzeugt. Meiner Meinung nach sollte P da nicht ewig blocken :frowning:

Habe das Problem unabhängig davon, ob ich meine Implementierung der Semaphore verwendet oder die vom Lehrstuhl.[/s]

edit: hat sich erledigt :slight_smile:


Gegenbeispiel:

#include <iostream>

class Foo {
	public:
		int bar(int a) {
			return a + 1;
		}
};

int main(int argc, char *argv[]) {
	Foo *foo = nullptr;
	std::cout << foo->bar(41) << std::endl;
};

Compile with: [m]clang++ -Wall -Werror -Weffc++ -std=c++11 test.cpp[/m]


Warum funktioniert das? Auch wenn mein C++ nicht sonderlich gut ist, würde ich erwarten, dass mir sowas um die Ohren fliegt.


Weil [m]this[/m] im Code der Methode nicht dereferenziert wird (tatsächlich wird es ja noch nicht mal benutzt). Es gilt zwar [m]this == nullptr[/m], aber das stellt erst dann ein Problem dar, wenn man versucht über den Nullpointer zuzugreifen. Ich nehme an wäre die Methode [m]virtual[/m] würde das reichen, um einen Segfault zu produzieren.


Stellt sich die Frage, wie sinnvoll es ist eine Instanzmethode zu schreiben, die nicht auf die Instanz zugreift…

@kronos: Instanzmethoden sind eigentlich auch nur Methoden, nur dass als quasi „versteckter“ Parameter noch ein Pointer mit dem namen [m]this[/m] auf dein Objekt übergeben wird. Solange du diesen Pointer nicht dereferenzierst ([m]this->foo = bar;[/m]) fällt der Nullpointer nie auf. Aber wenn du sowas in der ganzen Methode nicht tust, sollte sie vermutlich statisch sein. Für Vererbung brauchst du auch meistens einen gültigen Pointer…