Array String ]GCC C++} Programmabsturz

jkallup

Erfahrenes Mitglied
Hallo,

ich habe folgende Struktur (in einer DLL):

Code:
struct ArrayObjectDefinition {
  int element;
  int arr_type;
  double var_float;
  std::string var_char;
};

Code:
std::vector<ArrayObjectDefinition> ArrayListe[2048];

Code:
extern "C" EXPORT void add_string_array_element(int n, char *s)
{
  ArrayListe[SelectedArrayElement][n].arr_type = 2;
  ArrayListe[SelectedArrayElement][n].var_char = s

  cout << "--> " << s << endl;
  // wird nie erreicht
}

leider crasht das Programm bei aufrufen der Funktion ober - warum?

Gruß
Jens
 
Es reicht nicht das Array zu definieren, du musst auch die einzelnen Elemente initialisieren, denn auch wenn du ein array mit 2048 Elementen erstellt hast ist array[0] nach wie vor undefiniert.
Darüber hinaus kannst du array[n] nicht mal direkt initialisieren, zumindest nicht solange array[n-1] undefiniert ist.
 
Es reicht nicht das Array zu definieren, du musst auch die einzelnen Elemente initialisieren

Das ist so nicht korrekt. Beim Deklarieren eines Arrays von Klassenelementen wird deren Konstruktor aufgerufen. Beispiel:
C++:
class Foo
{
public:
	Foo() { std::cout << "Foo::Foo" << std::endl; }
};

Foo foos[10];

Da ist auch nicht das eigentliche Problem. Das Problem ist, dass du auf Werte im Vektor zugreiffst, die vermutlich nicht existieren.

Genau für solche Sachen werfen praktisch alle STL-Funktionen nette Exceptions!
C++:
extern "C" EXPORT void add_string_array_element(int n, char *s)
{
  try
  {
    ArrayListe[SelectedArrayElement][n].arr_type = 2;
    ArrayListe[SelectedArrayElement][n].var_char = s;
  }
  catch(std::exception& e)
  {
    std::cout << "Exception in " << __FUNCTION__ << ": '" << e.what() << "'!" << std::endl;
    return;
  }

  std::cout << "--> " << s << endl;
}
 
Hi.
Da ist auch nicht das eigentliche Problem. Das Problem ist, dass du auf Werte im Vektor zugreiffst, die vermutlich nicht existieren.

Genau für solche Sachen werfen praktisch alle STL-Funktionen nette Exceptions!
Und das ist so nicht korrekt.

Aus Effizienzgründen wirft der operator[] eines std::vectors eben keine Exception. Da muß man schon die std::vector<T>::at Methode verwenden.

Gruß
 
Code:
  std::string str(s);
  ArrayListe[n][SelectedArrayElement].arr_type = 2;
  ArrayListe[n][SelectedArrayElement].var_char = str;

geht auch nicht
 
habe den fehler gefunden:
und zwar habe ich in einen assembler modul, falsch programmiert.
statt beim übergeben eines strings an einer funktion, habe
ich "push dwotd [adresse]" durch "push addresse" ausgetauscht
und schon lief das programm.
danke für eure unterstützung!!
 
Hi.
Und das ist so nicht korrekt.

Aus Effizienzgründen wirft der operator[] eines std::vectors eben keine Exception. Da muß man schon die std::vector<T>::at Methode verwenden.

Gruß

Dann hab ich wohl was anderes. Bei mir wird bei std::vector<T>::operator[] bei einem falschen Subskript eine Exception (nicht eine Assertion) geworfen.

/Edit: So sieht das bei mir aus:
http://pastebin.com/sxADKp2W
Wird wohl das _SCL_SECURE_VALIDATE_RANGE sein, das da für die Exception zuständig ist. Vielleicht liegt das daran, dass ich die STL-Header gesondert irgendwo gedownloadet habe.

/Edit2: Das gibt in der Konsole bei mir schön brav "invalid vector<T> subscript" aus.
C++:
int main(int argc, char* argv[])
{
	new ExceptionHandler();
	sExceptionHandler.AttachToProcess();
	std::vector<int> foo;
	foo[2] = 1;
}
 
Zuletzt bearbeitet:
Dann hab ich wohl was anderes. Bei mir wird bei std::vector<T>::operator[] bei einem falschen Subskript eine Exception (nicht eine Assertion) geworfen.

/Edit: So sieht das bei mir aus:
http://pastebin.com/sxADKp2W
Wird wohl das _SCL_SECURE_VALIDATE_RANGE sein, das da für die Exception zuständig ist. Vielleicht liegt das daran, dass ich die STL-Header gesondert irgendwo gedownloadet habe.

/Edit2: Das gibt in der Konsole bei mir schön brav "invalid vector<T> subscript" aus.
C++:
int main(int argc, char* argv[])
{
	new ExceptionHandler();
	sExceptionHandler.AttachToProcess();
	std::vector<int> foo;
	foo[2] = 1;
}
Das hat mit den Debugging Einstellungen deiner STL zu tun und ist demnach kein Standard. Du siehst doch selbst das der Code nur bei bestimmten Debug-Einstellungen per #ifdef eingebunden wird. In einem Release Build bekommst du keine Ausnahme. Und die Ausnahme die du bekommst ist auch keine std::exception, oder?!

vector::at

public member function

const_reference at ( size_type n ) const;
reference at ( size_type n );

Access element
Returns a reference to the element at position n in the vector.

The difference between this member function and member operator function operator[] is that vector::at signals if the requested position is out of range by throwing an out_of_range exception.

Gruß
 
Zurück