VS2010 System.Runtime.InteropServices.SEHException bei new operator



  • Hi, wenn ich folgenden Code ausführe kommt es bei mir zu obigen Problem,

    *An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in MFF_Analyse.exe

    Additional information: External component has thrown an exception.*
    zunächst eine Bechreibung der Variablen

    vec = fac.decomposeToBands(values,sigmas,false,5);
    

    ergibt einen std::vector der Länge 5 von einzelnen Matrizen mit Komplexen zahlen,der vector enthält die Werte ordnungsgemäss,

    myComplex * data; // Holt die matrizen aus vec
    double * transformedData; //Für Visuelle darstellung eines grauwertbildes [0-255]
    
    for(int i = 0; i < 5;i++){
    data = vec.at(i);
    transformedData = fac.transformToGrayLevelRange(data,256); 
    ....Nimm transformedData  und speichere es in einem bitmap ab....
    }
    

    der fehkler taucht bei fac.transformToGrayLevelRange auf , an einer stelle die ich nciht verstehe nämlich bei

    /*Transform to whole range of Gray Levels*/
    	 /*
    	 @param data : input data, take only real part
    	 @param N : Number of GrayLevels
    	 return - int array with transformed values
    	 */
    	double * FFTFactory::transformToGrayLevelRange(myComplex * data,int N){
    		double Maximum = -32767; //Min Int value
    		double Minimum = 32767; //Max Int value
    	---->>	double * out = new double[height*width];
    		....
    
    		return out;
    	}
    

    Interessant ist dass die äussere i schleife variable oft durhlaufen wird bevor der fehler ausgelöst wird, daher manchmal bei i = 2, manchmal bei i = 3, ih verstehe leider nicht woran dies liegen könnte, kann mir jemand bitte weiterhelfen?

    Danke,

    Lg
    Maz

    PS: Ich verwende keine Threads, alles läuft seriell ab!



  • Die Exception kommt von der CLR (.NET).
    Ich sehe aber nicht dass .NET gebraucht wird, also schalte mal /clr ab.

    Simon



  • theta schrieb:

    Die Exception kommt von der CLR (.NET).
    Ich sehe aber nicht dass .NET gebraucht wird, also schalte mal /clr ab.

    Sorry, wie meinst du das? / clr abschalten?

    Lg
    Maz



  • Bei den Projekt Einstellungen gibts CLR Support (oä.).. dort auf Kein CLR Support (oä.) stellen...



  • Und grundsätzlich bei neuen Projekten ein leeres Win32-Konsolenprogramm anlegen (Da ist der Schalter standardmäßig deaktiviert).



  • Hi Leute, ich denke das Problem liegt niht wirklich in diem wie oben angegeben , sondern an einer inewffizienten speicherverwaltung

    ich habe oftmals dynamsiche heap allocationen in meinen Funktionen mit ..= new[int someint], die dann retourniert werden, jetzt habe ich gelesen dass diese speicher selbst nach funktionablauf nicht mehr freigegeben werden, sollte ich dann ein konstrukt wie folgend machen?

    for(int i =0; i < X; i++){
        double * arr;
    
        arr = somefunction(arr) -> der output wird mit new erzeigt
        ....tu etwas mit dem array....
        delete[]arr;
    }
    


  • 🙄



  • mazzok schrieb:

    Hi Leute, ich denke das Problem liegt niht wirklich in diem wie oben angegeben , sondern an einer inewffizienten speicherverwaltung

    Grundsätzlich deutet ein "System." tendenziell auf eine Fehlermeldung aus .Net hin. Und entweder bist du im falschen Forum (C++/CLI wäre für C++ mit .Net, und ja, das ist eine eigene Sprache), oder die Einstellungen deines Projektes stimmen nicht. Unabhängig davon das du vielleicht ein Fehler im Code haben könntest.


  • Administrator

    asc schrieb:

    mazzok schrieb:

    Hi Leute, ich denke das Problem liegt niht wirklich in diem wie oben angegeben , sondern an einer inewffizienten speicherverwaltung

    Grundsätzlich deutet ein "System." tendenziell auf eine Fehlermeldung aus .Net hin.

    Nein, ich glaube es gehört zusammen. Als ich schon das erste Mal diesen Thread gelesen habe, hatte ich diese Vermutung, war mir aber nicht so recht sicher. Nun verstärkt sich aber mein Verdacht.
    In .Net wird eine SEHException zum Beispiel dann geworfen, wenn von einem C++ Bereich eine C++ Exception in den .Net Teil fliegt. Daher denke ich, dass er einfach eine std::bad_alloc Exception zugeworfen bekommt 😉

    Grüssli



  • Dravere schrieb:

    In .Net wird eine SEHException zum Beispiel dann geworfen, wenn von einem C++ Bereich eine C++ Exception in den .Net Teil fliegt. Daher denke ich, dass er einfach eine std::bad_alloc Exception zugeworfen bekommt 😉

    Dan sollte der OP in seinem nicht-CLR-Projekt trotzdem zuerst die /clr-Option deaktiviere und dann dem bad_alloc auf die Schliche kommen 😉



  • pumuckl schrieb:

    ...und dann dem bad_alloc auf die Schliche kommen 😉

    mazzok schrieb:

    ...new[int someint], die dann retourniert werden, jetzt habe ich gelesen dass diese speicher selbst nach funktionablauf nicht mehr freigegeben werden...

    Das dürfte dann ja nicht soo schwer sein 😉



  • Hallo, Danke an eure vielen Beiträge

    so wie dravere es gesagt hat, es bestand wirklich ein speichermanagement problem, alles funktioniert jetzt problemlos!

    Lg
    M


Anmelden zum Antworten