Debug-Assertion fehlgeschlagen! Ausdruck: _BLOCK_TYPE_IS_VALID [closed]

Lesezeit: 7 Minuten

Ich bekomme diese Fehlermeldung:

Debug-Assertion fehlgeschlagen!

Ausdruck:_BLOCK_TYPE_US_VALID(pHead->nBlockUse)

während Sie versuchen, Folgendes zu tun

#include <vector>
#include <algorithm>
using namespace std;

class NN
{
public:
    NN(const int numLayers,const int *lSz,const int AFT,const int OAF,const double initWtMag,const int UEW,const double *extInitWt);
    double sse;
    bool operator < (const NN &net) const {return sse < net.sse;}
};

class Pop
{
    int popSize;
    double a;
public:

    Pop(const int numLayers,const int *lSz,const int AFT,const int OAF,const double initWtMag,const int numNets,const double alpha);
    ~Pop();
    vector<NN> nets;
    void GA(...);
};

Pop::Pop(const int numLayers,const int *lSz,const int AFT,const int OAF,
         const double initWtMag,const int numNets,const double alpha)
{
    popSize=numNets;
    a=alpha;
    nets.reserve(popSize);
    for(int i=0;i<popSize;i++)
    {
        NN *net = new NN (numLayers,lSz,AFT,OAF,initWtMag,0,0);
        nets.push_back(*net);
    }
}

void Pop::GA()
{
...
        sort(nets.begin(),nets.end());
...
}

Der Fehler scheint mit der Sortierfunktion zusammenzuhängen. Ich überprüfe alle Instanzen von Netzvektoren und sie scheinen in Ordnung zu sein, da sie unterschiedliche SSEs haben. Das Lustige ist, dass ich einen einfacheren Fall des obigen Codes (siehe unten) erstellt habe und es ohne Fehler funktioniert hat. Ich zerstöre mein Gehirn. Bitte helfen Sie.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class Student
{
public:
    string name;
    double grade;
    Student(string,double);
    bool operator < (const Student &st) const {return grade < st.grade;}
};

Student::Student(string stName,double stGrade)
{
    name = stName;
    grade = stGrade;
}

int main()
{
    vector<Student> group;
    Student *st;
    st = new Student("Bill",3.5);
    group.push_back(*st);
    st = new Student("John",3.9);
    group.push_back(*st);
    st = new Student("Dave",3.1);
    group.push_back(*st);
    sort(group.begin(),group.end());
    for each(Student st in group)
        cout << st.name << " " << st.grade << endl;
    cin.get();
    return(0);
}

  • Ihr Code hat eine Menge Speicherlecks. Sie rufen new NN auf und fügen dann das Objekt zum Vektor hinzu – das Objekt wird in den Vektor kopiert und das ursprüngliche Objekt bleibt auf dem Heap und Sie löschen es nicht. Es ist ein Speicherleck, aber es ist wahrscheinlich nicht die Ursache des Problems.

    – scharfer Zahn

    9. Juli 2009 um 6:28 Uhr

  • Beantwortet das deine Frage? Warum erhalte ich _CrtIsValidHeapPointer(block)- und/oder is_block_type_valid(header->_block_use)-Assertionen?

    – lese

    2. November 2020 um 14:25 Uhr

Die _BLOCK_TYPE_IS_VALID-Assertion wird ausgelöst, wenn Sie den Header eines Blocks überschreiben, der von zugewiesen wurde new. Dies passiert, wenn Sie Objekte aufschneiden, tote Objekte verwenden usw.

Sie sollten sich Ihren vollständigen Code ansehen und versuchen, mit den Daten zu arbeiten, die Sie in Ihrem Debugger haben. Dieses kurze Code-Snippet enthält mehrere “kuriose” Verwendungen von C++, aber keinen offensichtlichen Punkt, an dem dies den beschriebenen Fehler erzeugt (zumindest für mich).

meiner Erfahrung nach könnte diese Art von Fehler durch Heap-Korruption verursacht werden. Sie müssen also zuerst nach Speicherlecks suchen. Wenn Sie Visual Studio verwenden, verwenden Sie _CrtCheckMemory().

Danke an alle. Zuerst lösche ich den Speicher, der für nets vector innerhalb des Pop-Destruktors zugewiesen wurde, indem ich ihn lösche

Pop::~Pop()
{
    //nets.clear();
    nets.~vector<NN>();
}

Die Fehlermeldung sagt nicht viel aus und ich würde mich freuen, wenn mir jemand zeigt, wie man MSVC 2008 dazu bringt, detailliertere Informationen anzuzeigen. Hier ist, was es sagt (ich kann es aus irgendeinem Grund nicht ausschneiden und einfügen, also tippe ich es noch einmal ein):

Debug assertion failed!
Programm: ... GANN.exe
File: ... dbgedl.cpp
line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information how ...

Wenn ich debug drücke, zeigt mir der Compiler Zeile 52 der Datei dbgdel.cpp:

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

Innerhalb

void-Operator delete(void *pUserData)

Hier ist mehr von meinem Code, der zeigt, was passiert, bevor ich versuche zu sortieren

double Pop::GA(...)
{
    for (int gen=0;gen<ngen;gen++)
    {
        int istart=0;
        if(gen>0) istart=eliteSize;
        for(int i=istart;i<popSize;i++)
            nets[i].getSSE(in,tgt,ntr,discount);

        for(int i=istart;i<popSize;i++)
        {
            cout << i << " " << nets[i].sse << endl;
        }

        sort(nets.begin(),nets.end());

Bis auf sort() funktioniert alles einwandfrei. Der lSz-Zeiger wird innerhalb von NN verwendet, um die Anzahl der Knoten in jeder Schicht des neuronalen Netzwerks zu halten, zum Beispiel lSz[3]= {12,5,1} (12 Eingänge, eine verborgene Schicht mit 5 Neuronen und ein Ausgang). Es wird verwendet, um ein 3D-Array der Gewichte für jede Verbindung des Netzwerks zu erstellen. Jedes Netzwerk NN (es gibt 100 davon) innerhalb der Population hat sein eigenes Gewichtungsfeld. Aber sie teilen die gleiche lSz[] und andere strukturelle Parameter, die leider von einer anderen NN-Instanz auf die andere kopiert werden. Ich wollte static verwenden, um diese Shared-Class-Member zu deklarieren, aber das würde eine Parallelisierung verhindern.

Ich habe gerade entdeckt, dass wenn ich Pop-Konstruktionen wie diese mache

Pop::Pop(const int numLayers,const int *lSz,const int AFT,const int OAF,
         const double initWtMag,const int numNets,const double alpha)
{
    popSize=numNets;
    a=alpha;
    cout << "defined a\n";
    nets.reserve(popSize);
    NN *net = new NN (numLayers,lSz,AFT,OAF,initWtMag,0,0);
    for(int i=0;i<popSize;i++)
    {
        //NN *net = new NN (numLayers,lSz,AFT,OAF,initWtMag,0,0);
        nets.push_back(*net);
    }
}

Dann funktioniert alles, einschließlich sort(). Aber das funktioniert bei mir nicht, weil jetzt der nets-Vektor die gleiche Instanz von NN popSize-Zeiten enthält. Die Idee war, jede dieser Instanzen einzeln zu initialisieren. Jede Instanz von NN soll ein eigenes Array von Gewichtungen haben, die zufällig im NN-Konstruktor initialisiert werden:

NN::NN(const int numLayers,const int *lSz,const int AFT,const int OAF,const double initWtMag,
       const int UEW,const double *extInitWt)
{
//  set number of layers and their sizes
    nl=numLayers;
    ls=new int[nl];
    for(int i=0;i<nl;i++) ls[i]=lSz[i];

//  set other parameters
    aft=AFT;
    oaf=OAF;
    binMid=0.0;
    if(aft==0) binMid=0.5;

//  allocate memory for output of each neuron
    out = new double*[nl];
    for(int i=0;i<nl;i++) out[i]=new double[ls[i]];

//  allocate memory for weights (genes)
//  w[lr #][neuron # in this lr][input # = neuron # in prev lr]
    w = new double**[nl];
    for(int i=1;i<nl;i++) w[i]=new double*[ls[i]];
    for(int i=1;i<nl;i++)                   // for each layer except input
        for(int j=0;j<ls[i];j++)            // for each neuron in current layer
            w[i][j]=new double[ls[i-1]+1];  // w[][][ls[]] is bias

//  seed and assign random weights (genes)
    SYSTEMTIME tStart,tCurr;
    GetSystemTime(&tStart);
    for(;;)
    {
        GetSystemTime(&tCurr);
        if(tCurr.wMilliseconds!=tStart.wMilliseconds) break;
    }
    srand(tCurr.wMilliseconds);
    int iw=0;
    for(int i=1;i<nl;i++)                   // for each layer except input
        for(int j=0;j<ls[i];j++)            // for each neuron in current layer
            for(int k=0;k<=ls[i-1];k++)     // for each input of curr neuron incl bias
                if(UEW==0) w[i][j][k]=initWtMag*2.0*(rand()/(double)RAND_MAX-0.5);
                else w[i][j][k]=extInitWt[iw++];
}

Manchmal liegt es daran, dass Sie eine Zeichenfolge der Länge x haben und versehentlich ein längeres Wort eingefügt haben … das ist in meinem Fall passiert.

  • Dies sollte ein Kommentar sein, keine Antwort

    – welche

    28. September 2012 um 7:17 Uhr

  • Dies sollte ein Kommentar sein, keine Antwort

    – welche

    28. September 2012 um 7:17 Uhr

861820cookie-checkDebug-Assertion fehlgeschlagen! Ausdruck: _BLOCK_TYPE_IS_VALID [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy