Merkwürdiger Speicherzugriffsfehler
-
@Furble Wurble
Ja für einen Java Umsteiger ist das schon schwer Muss ich mir merken, dass das so einfach geht.
In meinem C++ Buch (Der C++ Programmierer) stand es mit insert und make_pair. Deswegen hatte ich es so gemacht
Gibt es alternativen zu *void?
-
Waishon schrieb:
Gibt es alternativen zu *void?
Ja. Je nach Zusammenhang sind die beste Alternative meistens Templates. Manchmal aber auch anderes. Aber void* sind typisch für C und kommen in C++ so gut wie nie vor.
-
Ok werde ich mir mal durchlesen
Wie würde das denn in diesem Beispiel aussehen, dass ich mir darunter etwas vorstellen kann
So?
template<typename T> TelemetryReceiver(ComputeCaptureFrame computeCaptureFrame, T *cRDFParams);
-
Möglicherweise. Ich werd aus deinem Eingangbeitrag nicht so ganz schlau, was hier überhaupt genau passieren soll. Was mich jedenfalls auf den ersten Blick wundert, ist der Zeiger. Ich kann mir kaum vorstellen, dass hier nicht eine Referenz oder eine Kopie besser wären.
-
Du meinst?
void *cRDFParams
Das hatte ich so aus dem Code von meinem Vorgänger, ich kann es ja mal anders versuchen
-
Nein!
Entweder als Referenz
T & cRDFParams // evtl. zusätzlich noch const
oder als Kopie
T cRDFParams
Bei Templates würde ich aber generell eher zu Referenzen raten (da eine Kopie, je nach Typgröße, recht teuer sein kann - insb. wenn noch selbsterstellte Kopierkonstruktoren dazukommen)!
-
Vielen Dank für die Antworten.
Ich hätte noch eine Frage zum new Parameter:
Aktuell instanziere ich eine Klasse so:
Header
TelemetryReceiver *_teleRecv;
File
_teleRecv = new TelemetryReceiver();
Wie kann ich das ohne new lösen, da es ja böse ist
Außerdem habe ich hier noch einen Thread:
Wie kann ich t in den Header speichern und dann den neuen Thread zuweisen ohne new?std::thread t(&TelemetryReceiver::CaptureFrameThread, this); t.join();
-
Einfach den Stern * weglassen und dich an Memorymanagement vom feinsten erfreuen.
Edit: wenn es natürlich garnicht ohne pointer geht:
shared_ptr<TelemetryReceiver> __teleRecv;
und
__teleRecv = make_shared<TelemetryReceiver>();
-
Das new darf aber bestehen bleiben?
Ok habs geht ohne danke
bzw wie geht das bei den Threads?
-
Nein, natürlich nicht?!
-
Waishon schrieb:
bzw wie geht das bei den Threads?
Wie geht was bei welchen Threads?
-
tkausl schrieb:
Einfach den Stern * weglassen und dich an Memorymanagement vom feinsten erfreuen.
Edit: wenn es natürlich garnicht ohne pointer geht:
shared_ptr<TelemetryReceiver> __teleRecv;
und
__teleRecv = make_shared<TelemetryReceiver>();
Der erste Instinkt ist unique_ptr. shared_ptr darf man nur mit gutem Grund verwenden. __teleRecv ist übrigens kein guter Variablenname (da reserviert).
-
So ich habe ein neues Problem, auch mal wieder mit Speicherzugriffsfehler:
Es geht um felgenden Code:
// Joystick-Daten sperren _joystickMutex->lock(); { // Achswerte kopieren memcpy(_joystickAxis, &data[1], sizeof(short) * _joystickAxisCount); // Buttonwerte kopieren memcpy(_joystickButtons, &data[1 + sizeof(short) * _joystickAxisCount], sizeof(BYTE) * _joystickButtonCount); } _joystickMutex->unlock();
Dieser Teil, ist ein Teil einer Empfangsmethode eines TCPServers.
Wenn ich jedes Byte einzeln mit entsprechenden Abstand sende, klappt alles wunderbar. Auch die ersten paar Bytes, die unmittelbar nacheinander gesendet werden. Sobald man allerdings kurz wartet, kommt der gennante Speicherzugriffsfehler. Am Mutex liegt es nicht, da dieser Fehler auch entsteht, wenn dieser komplett auskommentiert ist.
Ich denke es liegt an memcpy. Irgendeiner eine Idee?
Es liegt am 2. memcpy. Wenn dieser auskommentiert ist klappt es
Dieser Fehler tritt erst auf, seitdem ich eine neue Klasse hinzugefügt habe
-
Gibts nen Grund warum du bei &data[1] anfängst?
-
Jap data[0] ist das Kommandobyte, dass in Switch Case abgefragt wird
Hier noch die ganze Klasse:
http://pastebin.com/SYZS1CmtEDIT:// Ich sehe gerade, wenn ich data[1] steht dort nichts, und als cast zum int 0. Normalerweise dürfte das nicht 0 sein.
Edit2:// Erledigt Kollege hat im Nervana ein Zugriff auf eine Variable gesetzte, die auskommentiert war