Forum: PC-Programmierung Memory deallocation char buf - c / Qt


von Rentner O. (rentner323)


Lesenswert?

Hallo!

Eine kleine Verständnisfrage habe ich:

Ich nutze eine C-Bibliothek in QT, ich muss von dieser Bibliothek 
mehrere Funktionen implementieren, also die Bibilothek hat die 
Funktionen Deklariert und ich muss sie Implementieren.

Dabei steht im Header folgender Satz im Kommentar über der Funktion:

The memory allocation and
deallocation for the buffer is handled by the callee.

Die Funktion bekommt mehrere parameter, davon ist eine "const char* 
buf", worauf sich wohl der Satz bezieht (die anderen sind alle keine 
Pointer und werden ja somit eh am Ende der Funktion gelöscht).

Innerhalb der Funktion gebe ich den Buffer an 
QUdpSocket::writeDatagram(char* buf, qint64 len, ...) weiter.

Muss ich den Buffer jetzt noch explizit löschen? Wie?
Woher weiß ich ob Qt (writeDatagram) den Buffer löscht?

Danke und Gruß!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rentner Opa schrieb:
> The memory allocation and
> deallocation for the buffer is handled by the callee.
>
> Die Funktion bekommt mehrere parameter, davon ist eine "const char*
> buf", worauf sich wohl der Satz bezieht

Nein, das passt nicht zusammen.  Wenn du einen Zeiger auf konstante
Daten hast, dann kann das nichts sein, was im Aufgerufenen
(“callee”) alloziert oder dealloziert wird.

Schätzungsweise soll das wohl bedeuten, dass du dich um Speicher
innerhalb deiner Bibliotheksfunktionen selbst kümmern musst.

von Rolf M. (rmagnus)


Lesenswert?

Jörg Wunsch schrieb:
> Nein, das passt nicht zusammen.  Wenn du einen Zeiger auf konstante
> Daten hast, dann kann das nichts sein, was im Aufgerufenen
> (“callee”) alloziert oder dealloziert wird.

Ich gebe dir da recht, ...

> Schätzungsweise soll das wohl bedeuten, dass du dich um Speicher
> innerhalb deiner Bibliotheksfunktionen selbst kümmern musst.

... allerdings wäre es auch etwas ungewöhnlich, das explizit zu 
dokumentieren. Daß eine Funktion sich um alles kümmern muß, das sie 
komplett intern macht, ist ja irgendwie logisch. Interessant wird's ja 
erst bei Daten, die rein oder raus gegeben werden.

von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:
> Jörg Wunsch schrieb:
>> Nein, das passt nicht zusammen.  Wenn du einen Zeiger auf konstante
>> Daten hast, dann kann das nichts sein, was im Aufgerufenen
>> (“callee”) alloziert oder dealloziert wird.
>
> Ich gebe dir da recht, ...
>
>> Schätzungsweise soll das wohl bedeuten, dass du dich um Speicher
>> innerhalb deiner Bibliotheksfunktionen selbst kümmern musst.
>
> ... allerdings wäre es auch etwas ungewöhnlich, das explizit zu
> dokumentieren.

Kommt drauf an.

So etwas
> Dabei steht im Header folgender Satz im Kommentar über der Funktion:
ist im Header File ja normalerweise die Information an den Verwender der 
Funktion/Funktionen und weniger ein Hinweis an den, der die Funktion 
implementiert.
Kommt drauf an, was die restlichen Funktionen so machen. Manchmal findet 
man auch Interfaces, in denen der Aufrufer einen Buffer bereitstellen 
soll und/oder spezielle Allokier oder Deallokierfunktionen aufrufen 
muss. In dem Fall wäre das dann der Hinweis auf den Verwender: Mach dir 
keine Sorgen, du brauchst dich da um nichts kümmern.

Ist aber nur meine Interpretation. Vielleicht ist das aber auch einfach 
nur ein "Standardsatz", der vom Auftraggeber standardmässig eingefügt 
wird ohne dass er darüber nachgedacht hat, ob das jetzt Sinn macht oder 
nicht.

von Eierkopp (Gast)


Lesenswert?

Ich kenne mich mit Qt nicht aus, aber in den Beispielen, die ich gesehen 
habe, wird eigentlich immer eine lokale Instanz von QByteArray 
verwendet.

QByteArray buf;
...
socket->writeDatagram(buf, ...);

Dafür gibt es doch extra
1
writeDatagram ( const QByteArray & datagram, const QHostAddress & host, quint16 port )

von Rentner O. (rentner323)


Lesenswert?

Es gibt diverse Versionen von QUdpSocket::writeDatagram, einige nehmen 
QByteArray, andere direkt einen buffer.

Danke soweit, ich werde mich euch anschließen und erstmal nichts weiter 
unternehmen und bei langzeittests dann mal auf die Speicherauslastung 
achten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.