2009-07-09 37 views
8

Tôi nhận được thông báo lỗi này:Xác nhận gỡ lỗi không thành công! Biểu thức: _BLOCK_TYPE_IS_VALID

Xác nhận gỡ lỗi Không thành công!

Biểu hiện: _BLOCK_TYPE_US_VALID (pHead-> nBlockUse)

trong khi cố gắng để làm như sau

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

Các lỗi dường như có liên quan đến chức năng sắp xếp. Tôi kiểm tra tất cả các trường hợp của vector lưới và họ có vẻ là OK, có khác nhau của sse. Điều thú vị là tôi đã tạo ra một trường hợp đơn giản hơn của mã trên (xem bên dưới) và nó hoạt động mà không có bất kỳ lỗi nào. Tôi đang phá hỏng bộ não của tôi. Hãy giúp tôi.

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

Toàn bộ thông báo lỗi là gì? Nó dường như bị cắt ngắn trong tiêu đề của bài đăng của bạn. – lavinio

+1

Mã của bạn có rất nhiều rò rỉ bộ nhớ. Bạn gọi NN mới và sau đó thêm đối tượng vào vector - đối tượng được sao chép vào vectơ và đối tượng gốc vẫn còn trên heap và bạn không xóa nó. Đó là một rò rỉ bộ nhớ nhưng nó không có khả năng là nguyên nhân của vấn đề. – sharptooth

+0

Tôi không thấy điều đó trong mẫu mã (trên) của anh ấy; có vẻ như anh ta đang tạo ra các đối tượng trên heap với 'NN * net = new NN (...' và sau đó chỉ cần đặt một bản sao của con trỏ đó vào trong vectơ. – lavinio

Trả lời

11

Xác nhận _BLOCK_TYPE_IS_VALID được kích hoạt khi bạn ghi đè tiêu đề của khối được phân bổ bởi new. Điều này xảy ra khi bạn cắt các đối tượng, sử dụng các đối tượng đã chết, v.v.

Bạn nên xem mã hoàn chỉnh của mình và cố gắng làm việc từ dữ liệu bạn có trong trình gỡ lỗi. Đoạn mã ngắn này có chứa một số cách sử dụng 'tò mò' của C++, nhưng không có điểm rõ ràng mà tại đó điều này tạo ra lỗi được mô tả (ít nhất là đối với tôi).

1

Cảm ơn mọi người. Trước tiên, tôi xóa bộ nhớ phân bổ cho lưới vector bên trong destructor Pop bởi

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

Các thông báo lỗi không nói nhiều và tôi sẽ đánh giá cao nếu ai đó chỉ cho tôi làm thế nào để làm cho MSVC 2008 để hiển thị một thông tin chi tiết hơn. Đây là những gì nó nói (Tôi không thể cắt và dán nó đối với một số lý do, vì vậy tôi đang gõ lại nó):

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

Khi tôi bấm debug, trình biên dịch cho tôi thấy dòng 52 của file dbgdel.cpp:

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); 

bên

trống operator delete (void * pUserData)

đây là một chi tiết của mã của tôi cho thấy những gì xảy ra trước khi tôi cố gắng sắp xếp

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

Mọi thứ hoạt động bình thường đến điểm sắp xếp(). Con trỏ lSz được sử dụng bên trong NN để giữ số nút trong mỗi lớp của mạng nơron, ví dụ lSz [3] = {12,5,1} (12 đầu vào, một lớp ẩn với 5 nơron và một đầu ra). Nó được sử dụng để tạo ra một mảng 3D của các trọng số cho mỗi kết nối của mạng. Mỗi mạng NN (có 100 trong số đó) bên trong Dân số có dãy trọng số riêng. Nhưng chúng chia sẻ cùng một lSz [] và các tham số cấu trúc khác, mà không may được sao chép từ thể hiện NN khác sang thể hiện khác. Tôi muốn sử dụng tĩnh để khai báo các thành viên lớp được chia sẻ này, nhưng điều đó sẽ ngăn cản sự song song.

0

Tôi chỉ phát hiện ra rằng nếu tôi làm xây dựng Pop như thế này

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

Sau đó, mọi thứ hoạt động, bao gồm cả loại(). Nhưng, điều đó không hiệu quả đối với tôi bởi vì bây giờ vector lưới chứa cùng một ví dụ về NN popSize lần.Ý tưởng là để intialize từng trường hợp riêng lẻ. Mỗi trường hợp của NN được cho là có một dãy trọng số riêng, được khởi tạo ngẫu nhiên bên trong hàm tạo 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++]; 
} 
3

từ kinh nghiệm của tôi- Loại lỗi này có thể do lỗi Heap gây ra. vì vậy .. trước tiên bạn phải kiểm tra rò rỉ bộ nhớ. Nếu bạn đang sử dụng Visual Studio sử dụng _CrtCheckMemory().

0

Thỉnh thoảng vì bạn có chuỗi có chiều dài x và bạn đã vô tình đặt một từ dài hơn vào đó ... đó là những gì đã xảy ra trong trường hợp của tôi.

+2

đây phải là nhận xét chứ không phải là câu trả lời – wich

Các vấn đề liên quan