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被修改。

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

原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11779073.html

时间: 2024-08-30 15:07:38

c++ 中全局/静态存储区的内存污染问题的相关文章

(转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始化的全局变量和静态变量  ) D:静态区域中:文字 数字 常量 E:静态区域中:代码区(就是编译后的二进制代码  指导CPU怎么运行的玩意) ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 栈,程

C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

      栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收.堆可以动态地扩展和收缩. 自由存储区,就是那些由 

(转载)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

C++内存分配方式详解--堆.栈.自由存储区.全局/静态存储区和常量存储区       栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结

c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区

在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的.

(转)C++堆、栈、自由存储区、全局/静态存储区和常量存储区

一.一个由c/C++编译的程序占用的内存分为以下几个部分:    1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.    2.堆区(heap) — 一般由程序员分配释放(malloc/free, new/delete),若程序员不释放,程序结束后可能由操作系统回收.注意它与数据结构中的堆石两回事,分配方式倒是类似与链表.其中有malloc/free分配释放的也可以叫自由存储区.   3.全局区(静态存储区)(static)— 全

内存管理(堆、栈、自由存储区、全局/静态存储区和常量存储区)

https://blog.csdn.net/caogenwangbaoqiang/article/details/79788368 https://www.cnblogs.com/lyl-312/p/5528892.html https://www.cnblogs.com/zhanjxcom/p/5766844.html 原文地址:https://www.cnblogs.com/urcaptain/p/10682611.html

转:计算机中栈区,堆区,静态存储区,文字常量存储区,代码区的详细解释

转:http://blog.csdn.net/dotneterbj/article/details/8021200 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事(数据结构中的堆是用数组模拟的),分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(

堆区、栈区和静态存储区详解

一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程

ios笔记-静态存储区、堆、栈

1.概念解释 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存.动态内存的生存期可以由我们决定,如果我们不释放内存