void-Zeiger



  • Hallo,

    wenn ein Speicher, der _nicht_ mit 'new' anfordert wurde, mit 'delete' freigegeben werden soll, kommt es bekanntlich zur Katastrophe. Meine Frage, läßt sich abfragen, ob ein Speicher mit 'new' allociert wurde oder nicht?

    void* p;
    
    mache_irgendwas_mit_p(p); 
    
    if( /* p wurde mit 'new' Speicher zugewiesen */ ) {
      delete p; 
    }
    

    Dank und Grüsse



  • wenn, dann hab ich davon noch nie gehört 😉



  • < Ach omg, es ging um void * - Zeiger. 😞 Was ist denn heute los. 🙄 >



  • Meine Frage, läßt sich abfragen, ob ein Speicher mit 'new' allociert wurde oder nicht?

    Soweit ich weis nein.

    Allerdings kannst du die globalen (also auch für ints) new und delete Operatoren überladen. Da sollte sich einiges machen lassen:

    vector<void*> mem_reg;
    void* operator new(size_t sz) {
      void*mem=malloc(sz);
      mem_reg.push_back(mem);
      return mem;
    }
    bool new_allocated(void*mem){
      for(vector<void*>::iterator i=mem_reg.begin();i!=mem_reg.end();i++)
      if(*i==mem)
           return true;
      return false;
    }
    void operator delete(void*mem) {
      for(vector<void*>::iterator i=mem_reg.begin();i!=mem_reg.end();i++)
      if(*i==mem)
      {
          mem_reg.erase(i);
          break;
      }
      free(mem);
    }
    


  • Hi,

    echt? Bei Build-In-Typen dürfte new/free() und malloc()/delete Kombinationen aber keine Probleme machen, oder, denn die Operatoren kapseln da ja auch nur malloc()/free()?

    Aber nicht schlagen, falls es nicht stimmt.

    ChrisM



  • Es muss nicht sein, deshalb darf man auch nicht new angeforderten speicher mit free freigeben.



  • ...aber sollte man in c++ nicht eh nur new und delete nehmen, und auf malloc&co komplett verzichten?



  • Korbinian schrieb:

    ...aber sollte man in c++ nicht eh nur new und delete nehmen, und auf malloc&co komplett verzichten?

    Sollte man.

    Code-Hacker



  • auto_ptr tut doch eigentlich genau das was #1 will, oder?



  • Der auto_ptr gibt Dir auch keine Möglichkeit zu prüfen mit was zuvor der Speicher angelegt wurde.

    char * foo(); // Hm, woher kommt der Zeiger. new malloc static global ?
    


  • ...aber sollte man in c++ nicht eh nur new und delete nehmen, und auf malloc&co komplett verzichten?

    Kommt darauf an wie du es siehst, in dem eigentlichen Kode sollte man nur new und delete benutzen. Allerdings wenn man die new/delete Operatoren überläde offensichtlich nicht.

    Fast immer wenn jemand mit alternativen zu new/delete rumspielt will er es irgendwie möglich machen Speicher in dem Program zu reserviren und in einer dll frei zu geben. Und dabei ist das doch eigentlich so einfach. In eine Dll packt man malloc und free (oder andere allocations Funktion wenn man umbedingt will):

    void*get_mem(size_t s){return malloc(s);}
    void free_mem(void*p){return free(p);}
    

    Und dann in den anderen Modulen überläd man new und delete so, dass sie nicht ihr eigenes malloc und free aufrufen sonder das von diesem Module. Somit ist das Problem aus der Welt geschafft weil immer das gleich Module die Speicher allocation übernimmt.



  • Sorry typefehler, in die free Funktion gehört natürlich kein return



  • Jedoch kann die genaue Implementierung von Compiler zu Compiler unterschiedlich sein, so das genau das fehlschlägt.

    malloc könnte bei Comiler A anderst funktionieren als bei Compiler B



  • jemand schrieb:

    in die free Funktion gehört natürlich kein return

    Funktioniert aber auch mit 🤡


Anmelden zum Antworten