Неудавшееся утверждение отладки! Выражение: _BLOCK_TYPE_IS_VALID [закрывается]

Если iframe находится непосредственно на странице, куда код работает, необходимо быть в состоянии сослаться на него непосредственно:


contentPanel1.Attribute = value;

, Если не (это находится в дочернем элементе управления или MasterPage), Вам будет нужна хорошая идея иерархии страницы... Или используйте метод "в лоб" записи рекурсивной версии FindControl ().

8
задан ForceMagic 22 June 2012 в 09:37
поделиться

3 ответа

Всем спасибо. Во-первых, я очищаю память, выделенную для вектора цепей внутри деструктора 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 ...

Когда я нажимаю кнопку отладки, компилятор показывает мне строку 52 файла dbgdel.cpp:

_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 для хранения количества узлов в каждом слое нейронной сети, например lSz [3] = {12,5,1} (12 входов, один скрытый слой с 5 нейронами и один выход). Он используется для создания трехмерного массива весов для каждого подключения к сети. Каждая сеть NN (их 100) внутри Population имеет свой весовой массив. Но у них одинаковые lSz [] и другие структурные параметры, которые, к сожалению, копируются из другого экземпляра NN в другой. Я хотел использовать static для объявления этих общих членов класса, но это предотвратило бы распараллеливание.

1
ответ дан 5 December 2019 в 11:26
поделиться

Утверждение _BLOCK_TYPE_IS_VALID запускается, когда вы перезаписываете заголовок блока, выделенного новым . Это происходит, когда вы нарезаете объекты, используете мертвые объекты и т. Д.

Вы должны взглянуть на свой полный код и попытаться работать с данными, которые есть в вашем отладчике. Этот короткий фрагмент кода содержит несколько «любопытных» случаев использования C ++, но не вызывает очевидных моментов, когда это приводит к описанной ошибке (по крайней мере, для меня).

11
ответ дан 5 December 2019 в 11:26
поделиться

Я только что обнаружил, что если я выполняю конструкцию Pop, подобную этой

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 (). Но это не работает для меня, потому что теперь вектор сетей содержит тот же экземпляр 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++];
}
0
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: