Problem mit Struktur die 2
-
Nachdem ich nun ein Speicherzugriffsproblem hatte und ich Tipps
bekam versucht ich nun folgendes://Konstruktor ... marker_info = (ARMarkerInfo*)malloc(sizeof(marker_info)); marker_info->area = 0; marker_info->cf = 0; marker_info->dir = 0; marker_info->id = 0; for(int i=0; i<4; i++) { for(int j=0; j<3; j++) { marker_info->line[i][j] = 0; } } for(int i=0; i<2; i++) { marker_info->pos[i] = 0; } for(int i=0; i<4; i++) { for(int j=0; j<2; j++) { marker_info->vertex[i][j] = 0; } } ...
jedoch bringt er mir jetzt überall wo ich ein new mache eine Speicherverletzung.
Zum Beispiel hier://a.h char* path_gfx_typ; //a.cpp path_gfx_typ = new char[40];
Hat jemand eine Idee, was ich falsch mach?
Gruß und Dank
-
Das einzige was mir auffällt, ist dass du C und C++ mischt, dass du malloc und new benutzt
entweder oder! Ob's daran liegt, kann ich dir nicht zeigen. Aber es wäre besser, wenn du die eine Variante oder die andere benutzt, änder mal das und schau ob du den Fehler noch bekommst.
-
wenn ich nur new benutzte bekomme ich ein Speicherzugriffsproblem bei marker_info:
ARMarkerInfo* marker_info;
marker_info = new ARMarkerInfo;
-
Wie sehen line, pos und vertex aus? Sind das Arrays oder Zeiger? Falls es Zeiger sind, hast du dafür keinen Speicher geholt.
-
es sind array'S!
der struct ist wie folgt aufgebaut:
typedef struct { int area; int id; int dir; double cf; double pos[2]; double line[4][3]; double vertex[4][2]; } ARMarkerInfo;
-
littlepeoplegirl79 schrieb:
wenn ich nur new benutzte bekomme ich ein Speicherzugriffsproblem bei marker_info:
ARMarkerInfo* marker_info;
marker_info = new ARMarkerInfo;malloc und new in C++ mischen ist sehr schlecht, weil sie anders arbeiten. Wozu typdef struct unter C++? Mach das weg und arbeite mit einem struct. Wie gesagt, mach die C Sachen vom C++ Code weg.
-
...oder die C++ Sachen (new) vom C-Code.
malloc und new in C++ mischen ist sehr schlecht, weil sie anders arbeiten.
Inwiefern? Meines Wissens nach ruft new lediglich noch den Konstruktor auf, was zwar ein wichtiger Unterschied ist, aber die Speicheranforderung ist gleich. U. u. wird malloc auch von new benutzt, aber das ist implementationsabhängig....
-
-
Also, wenn das nicht schön ist.
#include <cstdlib> int main() { int * x; x = new int[3]; free(x); return 0; }
Und valgrind darauf ausführe, bekomme ich
==15660== Mismatched free() / delete / delete [] ==15660== at 0x3414AAC5: free (vg_replace_malloc.c:153) ==15660== by 0x80484DD: main (in /home/rex/a) ==15660== Address 0x34231028 is 0 bytes inside a block of size 12 alloc'd ==15660== at 0x3414A959: operator new[](unsigned) (vg_replace_malloc.c:139) ==15660== by 0x80484CF: main (in /home/rex/a)
Mit diesem Code:
#include <stdlib.h> int main() { int * x; x = malloc(sizeof(int)*3); free(x); return 0; }
bekomme ich diese Warnungen/Fehler nicht. Allerdings wurde (Unter C++) den Speicher freigegeben, ich weiß nicht, ob gcc sowas erkennt und es korrigiert. Ich glaube, ich erinnere mich daran irgendwoo gelesen zu haben, dass new und malloc nicht gleich arbeiten, ich weiß aber leider nicht mehr, wo ich das gelesen hab.
-
Hallo,
valgrind sagt doch nur das, was du selber schon wusstest: Man soll new/malloc delete/free nicht mischen. Das Programm beendet sich normal.