B
Parapiler schrieb:
Nochmal, um es in diesem Forum zur Diskussion zu stellen (damit ich eventuell auch über meine Fehler aufgeklärt werde):
OK, angenommen
Ob du einen Zeiger oder einen Array nimmst ist egal, da der Array beim kompilieren intern zu einem Zeiger umgewandelt wird.
Das ist falsch. Das Speicherlayout ist völlig verschieden: ein Array besteht aus hintereinanderliegenden Elementen, ein Zeiger ist eine Adresse. Ein Array wird aber fast überall automatisch in einen konstanten Zeiger auf sein erstes Element umgewandelt ("fast" weil es bei sizeof nicht passiert).
Es gibt daher auch einen new Operator, der Speicher ab einer Adresse reserviert, die Du angibst. Dir sollte es eigendlich möglich sein, diese Adresse zu errechnen und diese new zu übergeben:
void* newadress = oldadress + sizeof (DATENTYP;
newadress = (void*) new (newadress) [BYTES];
Der Placement-new Operator reserviert keinen Speicher, sondern geht davon aus, dass du einen Pointer auf einen von dir bereits reservierten Speicher übergibst. Dann konstruiert er dort drin entsprechend Objekte. Bei primitiven Typen wie int tut Placement-new daher überhaupt nichts.
Wenn du das so machst wie du grad vorgeschlagen hast, ist das wie eine ganz normale Arrayüberschreitung, dh du zerstörst wahrscheinlich andere Daten, die dorthinter liegen.