2016-11-05 5 views
-1

(в первую очередь жаль на английском, Потому что я не очень хорошо на него)повреждения кучи обнаружено после нормального блока (# 181)

Я написал код для магического квадрата, который отлично работает и дает истинный квадрат.

Когда он скомпилирован, и я запускаю программу, нет ничего плохого.

Но когда он доходит до return 0 в main() я получаю эту ошибку

повреждение кучи обнаружен после нормального блока (# 180)

Я искал его, и я узнал мой square класс не соответствовал правилу трех (What is The Rule of Three?)

Итак, я попробовал это и снова получил ошибку.

Вот мой код.

#include<iostream> 


using namespace std; 

class square { 

public: 
//a n*n square which n=size 
    int size; 
//a set of blocks in square which is declared 
//by pointers cuz i couldn't simply write block[size][size] 
    int** block = new int*[size]; 
    square(const int _size) { 
     size = _size; 
     for (int c = 0;c < size;c++) { 
      block[c] = new int[size]; 
     } 
//putting 0 value in all blocks 
     for (int i = 0; i < size;i++) 
      for (int j = 0;j < size;j++) { 
       block[i][j] = 0; 
      } 
    } 
//distructor 
    ~square() { 
     for (int c = 0; c < size; c++) 
      delete block[c]; 

     delete block; 
    } 
//copy constructor 
    square(const square& that) { 
     for (int c = 0; c < size; c++) 
      delete block[c]; 

     delete block; 
     size = that.size; 
     block = new int*[size]; 
     for (int c = 0;c < size;c++) { 
      block[c] = new int[size]; 
     } 
     for (int i = 0; i < size;i++) 
      for (int j = 0;j < size;j++) { 
       block[i][j] = that.block[i][j]; 
      } 
    } 
//add or change the value of a block 
    void add_block(int &value, int i, int j) { 
     block[i][j] = value; 
    } 
//get the value stored in a block 
    int get_block(int i, int j) { 
     return block[i][j]; 
    } 
//get the size of the square 
    int get_size() { 
     return size; 
    } 
//display the square 
    void disp() { 
     for (int i = 0; i < size;i++) { 
      for (int j = 0;j < size;j++) { 
       cout << block[i][j]<<' '; 
      } 
      cout << endl; 
     } 

    } 


}; 
//just to write clean code i made this function 
//to get the size of the square from input 
int intro() { 
    cout << "magic square" << endl; 
    cout << "what's the size of rows and columns?(just enter an integer and must be one of the following numbers)" << endl; 
    cout << "3 , 5 , 7 , ... , (2n+1)" << endl; 
    int s_size; 
    cin >> s_size; 
    while (s_size % 2 == 0) { 
     cout << "!!! must be one of the following numbers : 3 , 5 , 7 , ... , (2n+1) !!!" << endl; 
     cout << "enter again" << endl; 
     cin >> s_size; 
    } 
    return s_size; 
} 
//look for next valid block to add the next number 
//and adding the next number 
//the algorithm is go up.go left.if not filled before 
//put new number. else go back to last position.go down.put the number. 
void add_next_magic_block(square &s,int &v,int &i , int &j) { 
    int s_size = s.get_size(); 
    int ii = i; 
    int jj = j; 
    if (i == 0) 
     i = s_size - 1; 
    else 
     i--; 
    if (j == s_size - 1) 
     j = 0; 
    else 
     j++; 
    if (s.get_block(i, j) == 0) 
     s.add_block(v, i, j); 
    else { 
     s.add_block(v, ++ii, jj); 
     i = ii; 
     j = jj; 
    } 
} 
//magic square which starts from [0][j/2] 
//and ends when it reaches to the 
//size*size 
//which is the last number 
void do_magic_square_on(square &s) { 
    int end = s.get_size()*s.get_size(); 
    int count=1; 
    int i = 0; 
    int j = s.get_size()/2; 
    s.add_block(count, 0, j); 
    count++; 

    while (count <= end) { 
     add_next_magic_block(s, count, i, j); 
     count++; 
    } 
} 


int main() { 
    int s_size = intro(); 
    square my_s(s_size); 

    do_magic_square_on(my_s); 

    my_s.disp(); 
    system("pause"); 
    return 0; 
} 

НЕ О Q & это отредактированный код здесь ссылку, чтобы запустить новый код http://cpp.sh/72mmg

#include<iostream> 


using namespace std; 

class magic_square { 

public: 


    int size; 
    int** block; 
    magic_square(int _size) :size(_size) , block(new int*[size]) { 
     size = _size; 
     for (int c = 0;c < size;c++) { 
      block[c] = new int[size]; 
     } 
     for (int i = 0; i < size;i++) 
      for (int j = 0;j < size;j++) { 
       block[i][j] = 0; 
      } 
    } 

    ~magic_square() { 
     for (int c = 0; c < size; c++) 
      delete block[c]; 

     delete block; 
    } 

    magic_square(const magic_square& that) { 
     for (int c = 0; c < size; c++) 
      delete block[c]; 

     delete block; 
     size = that.size; 
     block = new int*[size]; 
     for (int c = 0;c < size;c++) { 
      block[c] = new int[size]; 
     } 
     for (int i = 0; i < size;i++) 
      for (int j = 0;j < size;j++) { 
       block[i][j] = that.block[i][j]; 
      } 
    } 

    void add_block(int &value, int i, int j) { 
     block[i][j] = value; 
    } 

    int get_block(int i, int j) { 
     return block[i][j]; 
    } 

    int get_size() { 
     return size; 
    } 

    int sum_of_row(int row) { 
     int sum = 0; 
     int c = 0; 
     for (int c = 0; c < this->get_size(); c++) 
      sum += this->get_block(row, c); 
     return sum; 
    } 

    int sum_of_col(int col) { 
     int sum = 0; 
     int c = 0; 
     for (int c = 0; c < this->get_size(); c++) 
      sum += this->get_block(c, col); 
     return sum; 
    } 

    void disp() { 
     for (int i = 0; i < size;i++) 
      cout << '\t' << "["<<i+1<<"]"; 
     cout <<'\t'<<"row sum"<< endl << endl; 
     for (int i = 0; i < size;i++) { 
      cout << "[" << i + 1 << "]"; 
      for (int j = 0;j < size;j++) { 
       cout<<'\t'<< block[i][j]; 
      } 
      cout <<'\t'<<sum_of_row(i) <<endl; 
     } 
     cout <<endl <<"col sum"; 
     for (int i = 0; i < size;i++) 
      cout << '\t'<< sum_of_col(i); 
     cout << endl; 
    } 


}; 

int intro() { 
    cout << "magic square" << endl; 
    cout << "what's the size of rows and columns?(just enter an integer and must be one of the following numbers)" << endl; 
    cout << "3 , 5 , 7 , ... , (2n+1)" << endl; 
    int s_size; 
    cin >> s_size; 
    while (s_size % 2 == 0) { 
     cout << "!!! must be one of the following numbers : 3 , 5 , 7 , ... , (2n+1) !!!" << endl; 
     cout << "enter again" << endl; 
     cin >> s_size; 
    } 
    return s_size; 
} 

void add_next_magic_block(magic_square &s,int &v,int &i , int &j) { 
    int s_size = s.get_size(); 
    int ii = i; 
    int jj = j; 
    if (i == 0) 
     i = s_size - 1; 
    else 
     i--; 
    if (j == s_size - 1) 
     j = 0; 
    else 
     j++; 
    if (s.get_block(i, j) == 0) 
     s.add_block(v, i, j); 
    else { 
     s.add_block(v, ++ii, jj); 
     i = ii; 
     j = jj; 
    } 
} 

void normal_do_magic_square_on(magic_square &s) { 
    int end = s.get_size()*s.get_size(); 
    int count = 1; 
    int i = 0; 
    int j = s.get_size()/2; 
    s.add_block(count, 0, j); 

    //cout <<endl<< " <------STEP------> "<< "[" << count << "]" << endl<<endl; 
    //s.disp(); 
    //cout << endl; 

    count++; 
    while (count <= end) { 
     add_next_magic_block(s, count, i, j); 

     //cout << endl << " <------STEP------> " << "["<<count<<"]" << endl << endl; 
     //s.disp(); 
     //cout << endl; 

     count++; 
    } 
} 

void step_do_magic_square_on(magic_square &s) { 
    int end = s.get_size()*s.get_size(); 
    int count=1; 
    int i = 0; 
    int j = s.get_size()/2; 
    s.add_block(count, 0, j); 

    cout <<endl<< " <------STEP------> "<< "[" << count << "]" << endl<<endl; 
    s.disp(); 
    cout << endl; 

    count++; 
    while (count <= end) { 
     add_next_magic_block(s, count, i, j); 

     cout << endl << " <------STEP------> " << "["<<count<<"]" << endl << endl; 
     s.disp(); 
     cout << endl; 

     count++; 
    } 
} 

//to decide if show the steps or no 
void out_put(magic_square &s) { 
    cout << "want to see the steps?(y,n)"; 
    char in; 
    cin >> in; 
    if (in == 'n' || in == 'N') { 
     normal_do_magic_square_on(s); 
     s.disp(); 
    } 

    else if(in=='y' || in=='Y') 
     step_do_magic_square_on(s); 
} 

int main() { 
    int s_size = intro(); 
    magic_square my_s(s_size); 
    out_put(my_s); 
    system("pause"); 
    return 0; 
} 
+0

Пожалуйста, отредактируйте ваш вопрос, чтобы предоставить [mcve]. –

+0

@BaummitAugen Я не знаю, что вы имеете в виду. он уже завершен. –

+3

Не очень минимальный. –

ответ

0

На самом деле эта ошибка возникает при попытке выделить память для блока, здесь

int** block = new int*[size]; 

Это потому, что ваша переменная-член размер не инициализируется в этой точке вашего кода и содержит мусор. Мое предложение инициализировать обе переменные в конструкторе, например:

int size; 
int** block 
square(int _size) : size(_size), block(new int*[size]) { 
    size = _size; 
    for (int c = 0; c < size; c++) { 
     block[c] = new int[size]; 
    } 
    for (int i = 0; i < size; i++) 
     for (int j = 0; j < size; j++) { 
      block[i][j] = 0; 
     } 
} 

Помните о том, что, поскольку в коде выше я решил инициализировать размер, а затем использовать его для инициализации блок, размер должен быть определен доблок. Если изменить порядок декларации на что-то вроде

int** block 
int size; 

код будет использовать неинициализированный размер снова.

+0

Я думаю, что вы правы, но уверены ли вы в синтаксисе? Когда я пишу его в своей среде IDE, он говорит мне, что в синтаксисе есть что-то не так. –

+0

Да, проверьте это: http://cpp.sh/8mcvr –

+0

Я проверил ссылку, и она работает нормально, но я снова получаю сообщение об ошибке после копирования кода. –