externes Array in Klasse verwenden
-
Hallo,
ich möchte eine Array an eine Klasse übergeben (z.B. ein Eingangspuffer) und
unter Verwendung von Methoden am originalen Array Anderungen vornehmen. Dies funktioniert auch, solange das Objekt existiert. Wird der Destruktor aufgerufen, so ist der Zugriff auf das externes Array nicht mehr möglich. Wo ist der Denkfehler? Sollte nicht nur der Zeiger auf den Zeiger auf Int (int **data) freigegeben werden.Danke!
class TheClass { public: TheClass(int size, int **data); ~TheClass(void); int get_value(int position); void set_value(int position, int value); private: int **data; int size; }; TheClass::TheClass(int size, int **data_array){ data = data_array; this->size = size; } TheClass::~TheClass(void){ } int TheClass::get_value(int position){ return *data[position]; } void TheClass::set_value(int position, int value){ *data[position] = value; } int main(int argc, char **argv) { int *data; data = new int[10]; data[0] = 55; cout << data[0] << endl; TheClass test(10, &data); test.set_value(0, 99); cout << test.get_value(0) << endl; delete &test; cout << data[0] << endl; }
-
Du sollst nicht Objekte mit delete freigeben, die nicht mit new angelegt wurden.
-
gruuu schrieb:
class TheClass { public: TheClass(int size, int **data); ~TheClass(void); int get_value(int position); void set_value(int position, int value); private: int **data; int size; };Das mit dem Zeiger auf Zeiger ist irgendwie Quatsch hier.
TheClass::TheClass(int size, int **data_array){ data = data_array; this->size = size; } TheClass::~TheClass(void){ }Wenn Du hier nichts machst, kannst Du die Deklaration und die Definition des Destruktors weglassen.
int TheClass::get_value(int position){ return *data[position]; } void TheClass::set_value(int position, int value){ *data[position] = value; }Hier zerschießt Du Dir den automatischen Speicherbereich. [] bindet stärker als *, deswegen ist *data[pos] äquivalent zu *(data[pos]) und nicht (*data)[pos}, was Du eigentlich hättest schreiben müssen.
int main(int argc, char **argv) { int *data; data = new int[10]; data[0] = 55; cout << data[0] << endl; TheClass test(10, &data); test.set_value(0, 99); cout << test.get_value(0) << endl; delete &test; cout << data[0] << endl; }Dein delete ist falsch. Die Variable data wurde nicht per new angelegt. Das muss heißen "delete[] data";
-
Dein delete ist falsch. Die Variable data wurde nicht per new angelegt. Das muss heißen "delete[] data";
und das Ganze noch hinter das letzte
cout << data[0]...@gruuu: Drei Tips:
- Schreibe die Größe des Arrays nur ein einziges Mal und benutze dann diese Bezeichnung statt der "Magic number" 10, z.B.
#define ARRAY_SIZE 10oder besser
const unsigned int ARRAY_SIZE = 10;oder
enum { ARRAY_SIZE = 10 };und dann
data = new int[ ARRAY_SIZE ];- Deine Klasse weiß ja die Größe des Arrays. Daher solltest Du in
get_value( )undset_value( )den Index gegen diese Größe vergleichen, damit Du kein Element außerhalb erwischst --> tut weh.- Schau Dir mal die Klasse
vectoraus der Standard-Bibliothek an, das ist eine Art Array, das seine Größe selbst weiß und man braucht keine Pointer-Pointer.