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?


  • Mod

    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);
    

  • Mod

    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?!


  • Mod

    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/SYZS1Cmt

    EDIT:// 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


Anmelden zum Antworten