new und delete in DLLs und Threads



  • Wenn ich aus einer DLL eine Funktion exportiere, die Speicher mit new allokiert und einen Pointer an dei Anwendung zurückgibt und die den später versucht freizugeben, gibt das einen Fehler. Genasuo wenn ich im Programm Speicher mit new allokiere und den in einer DLL-Funktion mit delete freigeben möchte.
    Wiso ist das eigendlich so? Gibt es eine Möglichkeit da drumrum zu kommen?

    Und 2. Wenn ich in einem Thread speicher mit new allokiere und einen pointer auf den Speicher zu einem anderen Thread im selben Programm rüberschiebe, kann der zweite Thread dann den Speicher mit delete löschen??



  • mwoidt schrieb:

    Wiso ist das eigendlich so?

    exe und dll haben getrennte speicherbereiche

    mwoidt schrieb:

    Gibt es eine Möglichkeit da drumrum zu kommen?

    zb: shread memory
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp
    kommt aber darauf an was du machen willst

    zweites habe ich noch nicht probiert. 😃



  • DLL Runtime Library benutzen



  • miller_m schrieb:

    mwoidt schrieb:

    Wiso ist das eigendlich so?

    exe und dll haben getrennte speicherbereiche

    mwoidt schrieb:

    Gibt es eine Möglichkeit da drumrum zu kommen?

    zb: shread memory
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp
    kommt aber darauf an was du machen willst

    zweites habe ich noch nicht probiert. 😃

    Stimmt nicht ganz. Die dll wird in den addresraum von deinem prozess geladen, d.h. sie greift auch auf den selben speicherbereich zu. shared memory ist also blötsinn.
    Das problem das bei mwoidt auftitt ist, das es 2 heap-verwaltungen gibt. Ein heap ist im prinzip ne list mit ner menge speicher-blöcken. Wenn du nun was in der dll allokierst wird der speicherblock in die liste der dll eigetragen. Bei einem delete in der exe knallts jetzt, da es diesen speicherklock in der liste vom exe-heap nicht gibt.
    Ein paar ansätze wie man das verhindern kann:
    Linke die c-runtime nicht statisch, sondern dynamisch, dann gibts nur eine heap-verwaltung (versuche ich immer zu vermeiden, dann sobald jedem den schalter wieder zurückstellt knallts).
    Du machst das delete dort wie do alloziert hast.
    Das kannst du z.b. über den Delete/Release-Function machen.
    C-Version:

    // DLL
    BYTE* AllocData(size_t n) {
      retrun new BYTE[n];
    }
    void FreeData(BYTE *ptr) {
      delete[] ptr;
    }
    // exe
    void func()
    {
      BYTE *data = AllocData(n);
      //...
      FreeData(data);
    }
    

    C++ version

    // DLL
    class foo
    {
    public:
      void Release() {
        delete this;
      }
    }
    
    foo* CreateObj() {
      return new foo;
    }
    
    // exe
    void func()
    {
      foo* obj = CreateObj();
      //...
      obj->Release();
    }
    

Anmelden zum Antworten