Klassenzugriffe über shared memory/array



  • Hallo Leute,

    habe eine Frage.
    Ich möchte eine Klasse über shared memory bereitstellen. Dazu erstmal folgenden Pseudocode:

    class A{
     int var1, var2;
    public:
     void setvar1(...);
     int getvar1();
    };
    
    void main()
    {
     A objA;
     void* p = MallocSharedMemory(sizeof(A));
     memcpy(p, &objA, sizeof(A));
     waitforanything();
     cleanup;
    }
    
    void main()
    {
     A* a = static_cast<A*>(GetPreviouslyallocatedSharedMemory());
     a->getvar1();
    }
    

    Also der erste Teil enthält die zu sharende Klasse.
    Der zweite Teil erzeugt den shared memory, und kopiert den Klasseninhalt in den shared memory.
    Im dritten Teil wird der Zeiger auf den shared memory geholt und auf die Klasse umgecastet.
    Danach per Funktion zugegriffen.
    Getestet habe ich es bereits und es funktioniert auch (hatte ich nicht anderst erwartet).
    Das ganze funktioniert ja prinzipiell nur problemlos mit plain old data, reicht mir aber.
    Jetzt aber meine Frage:
    Ist es überhaupt "erlaubt" einen Zeiger auf ein Array umzucasten auf einen Zeiger auf ein Klasse?
    Kann es zu Problemen kommen? (gesharedte Klasse verwendet nur POD)



  • ist vielleicht nicht das schönste, aber speicher ist speicher und wenn du einfach ein stück speicher irgendwie anforderst und dann das in ein Objekt-Zeiger umcastest, darfst du natürlich nicht erwarten, dass da irgendwas gemacht wurde, was normalerweise im Konstruktor passiert. höchstens serparat in dem speicher den Konstrukter aufrufen ->
    MyClass* mc = new (p) MyClass();

    zu beachten ist natürlich, dass vtables, oder im Ctor angeforderter Speicher nicht im shared Memory liegt und bestenfalls auf der anderen Seite einen Absturz schlimmstenfalls eine unbemerkte Datenkoorumpierung zur Folge hat.

    wenn du das für POD machst also kein Problem, für komplexere oder gar polymorphe klassen schon.

    Solltest nur darauf achten, dass der angeforderte Speicher mindestens so groß ist wie sizeof(struktur).

    Edit:
    auf diese Art der Interprozess-Kommunikation würde ich verzichten.

    benutze lieber Sockets und serialisiere und deserialisiere deine Objekte sauber.



  • Ok danke.

    Mir sind deine angesprochenen Probleme durchaus bewusst.

    Ich benötige das für Drag&Drop und für USB.
    Bei letzterem erhalte ich z.B. einen 1k großen Datenblock, der ein wohldefiniertes Format hat (Messwerte oder ähnliches). Um nun nicht wild auf dem Speicher rumzucasten habe ich mir überlegt eine Klasse zu bauen, die diverse Operatoren auf den Speicher zulässt, und da erschien mir diese Lösung als am sinnvollsten?


Anmelden zum Antworten