zoukankan      html  css  js  c++  java
  • c++ 中全局/静态存储区的内存污染问题

    今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题。

    看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题

    先看代码

     1 #pragma once
     2 #pragma execution_character_set("utf-8")
     3 #include <iostream>
     4 #include <cstdio>
     5 using std::cout;
     6 using std::endl;
     7 
     8 const int COLUMNS = 8;
     9 const int ROWS = 8;
    10 int Matrix[COLUMNS][ROWS] = { 0 };
    11 
    12 void print()
    13 {
    14     for (int row = 0; row < ROWS; ++row)
    15     {
    16         for (int col = 0; col < COLUMNS; ++col)
    17         {
    18             cout << Matrix[row][col] << " ";
    19         }
    20         cout << endl;
    21     }
    22     cout << endl;
    23 }
    24 
    25 bool check(int row, int col)
    26 {
    27     //检查列
    28     for (int r = 0; r < row; ++r)
    29     {
    30         if (Matrix[r][col])
    31             return false;
    32     }
    33     for (int r = row - 1, c = col - 1; r != -1 && c != -1; --r, --c)
    34     {
    35         if (Matrix[r][c])
    36             return false;
    37     }
    38     for (int r = row - 1, c = col + 1; r != -1 && c != COLUMNS; --r, ++c)
    39     {
    40         if (Matrix[r][c])
    41             return false;
    42     }
    43     return true;
    44 }
    45 
    46 
    47 void writeQueen(int currentRow)
    48 {
    49     static int count = 0;
    50     if (currentRow == ROWS)
    51     {
    52         ++count;
    53         cout << count << endl;
    54         print();
    55         //return;    //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
    56     }
    57 
    58     int col = 0;
    59     for (; col < COLUMNS; ++col)
    60     {
    61         Matrix[currentRow][col] = 1;
    62         //print();
    63         if (check(currentRow, col))
    64             writeQueen(currentRow + 1);
    65         Matrix[currentRow][col] = 0;
    66     }
    67 }
    68 
    69 int main()
    70 {
    71     writeQueen(0);
    72 }

    运行出来后结果是这样的:

     即每个结果的序号都是1,明显不符合我的意图。

    之后就是寻找错误原因了,定位到这一段代码上:

     1 void writeQueen(int currentRow)
     2 {
     3     static int count = 0;
     4     if (currentRow == ROWS)
     5     {
     6         ++count;
     7         cout << count << endl;
     8         print();
     9         //return;    //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
    10     }
    11 
    12     int col = 0;
    13     for (; col < COLUMNS; ++col)
    14     {
    15         Matrix[currentRow][col] = 1;
    16         //print();
    17         if (check(currentRow, col))
    18             writeQueen(currentRow + 1);
    19         Matrix[currentRow][col] = 0;
    20     }
    21 }

    打断点进行调试。

     

     发现当执行Matrix[currentRow][col] = 0;这一句代码后count的值由1变为了0。

    为什么会这样呢?我看了一下地址:

     他两的地址居然是同一个!

    为什么会出现这种情况?

    count和Matrix都定义在全局区,Matrix的初始化语句为Matrix[8][8],原本Matrix所控制的内存空间与count的并不冲突,可是我访问Matrix时却越界了,我访问的是Matrix[8][0],而系统在分配内存时却恰好将count分配到了Matrix之后,这两变量的缘分太深了,没办法。。。由此造成了内存污染,当修改Matrix时无意中也造成了count被修改。

    所以,归根结底还是访问越界了!

  • 相关阅读:
    结算凭证中委托付款部分sql
    各公司年资金归集汇总sql
    通过开户银行账号查询客商名称 sql
    TRIGGER_15.8.3BACKUP
    备份触发器:ADDC3
    sql查询单个银行账号重复
    待研究:insert客商账户触发器增加条件提示为空
    sql:劳务统计各分公司管理费用明细合计(等同汇总报表)
    【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
    【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
  • 原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11779073.html
Copyright © 2011-2022 走看看