7

次のエラー メッセージが表示されます。

デバッグ アサーションに失敗しました!

式:_BLOCK_TYPE_US_VALID(pHead->nBlockUse)

次のことをしようとしている間

#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());
...
}

エラーはソート機能に関連しているようです。nets vector のすべてのインスタンスをチェックしましたが、それらは問題ないようで、異なる sse があります。おもしろいことに、上記のコード (以下を参照) のより単純なケースを作成したところ、エラーは発生しませんでした。私は私の脳を破壊しています。助けてください。

#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);
}
4

5 に答える 5

11

によって割り当てられたブロックのヘッダーを上書きすると、_BLOCK_TYPE_IS_VALID アサーションが発生しますnew。これは、オブジェクトをスライスしたり、死んだオブジェクトを使用したりしたときに発生します。

完全なコードを見て、デバッガーにあるデータから作業してみてください。この短いコード スニペットには、C++ の「興味深い」使用法がいくつか含まれていますが、説明されているエラーが発生する明確なポイントはありません (少なくとも私にとっては)。

于 2009-07-09T09:41:39.967 に答える
3

私の経験から-このタイプのエラーは、ヒープの破損が原因である可能性があります。だから..最初にメモリリークをチェックする必要があります。Visual Studio を使用している場合は、_CrtCheckMemory() を使用します。

于 2012-01-12T19:29:10.463 に答える
1

みんなありがとう。まず、Pop デストラクタ内のネット ベクターに割り当てられたメモリを次のようにクリアします。

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

エラー メッセージはあまり意味がありません。誰かが MSVC 2008 を作成してより詳細な情報を表示する方法を教えていただければ幸いです。これがその内容です(何らかの理由でカットアンドペーストできないため、再入力しています):

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

デバッグを押すと、コンパイラはファイル dbgdel.cpp の 52 行目を表示します。

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

中身

void operator delete(void *pUserData)

これは、並べ替えを試みる前に何が起こるかを示す私のコードの詳細です

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());

sort() ポイントまではすべて正常に動作します。lSz ポインターは、ニューラル ネットワークの各層のノード数を保持するために NN 内部で使用されます。ネットワークの各接続の重みの 3D 配列を作成するために使用されます。Population 内の各ネットワーク NN (100 個あります) には、独自の重み配列があります。しかし、それらは同じ lSz[] およびその他の構造パラメータを共有しており、残念ながら他の NN インスタンスから別の NN インスタンスにコピーされます。static を使用してこれらの共有クラス メンバーを宣言したかったのですが、それでは並列化が妨げられてしまいます。

于 2009-07-09T15:46:30.127 に答える
0

このようなポップ構築を行うと、

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);
    }
}

その後、sort() を含め、すべてが機能します。しかし、nets ベクトルには NN popSize 回の同じインスタンスが含まれているため、これはうまくいきません。アイデアは、これらのインスタンスを個別に初期化することでした。NN の各インスタンスには、NN コンストラクター内でランダムに初期化された独自の重みの配列があると想定されています。

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++];
}
于 2009-07-09T16:00:38.413 に答える
0

長さ x の文字列があり、誤って長い単語を入れてしまったことが原因である場合があります...それが私の場合に起こりました。

于 2012-09-07T12:32:58.360 に答える