c++ 中全局/静态存储区的内存污染问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++ 中全局/静态存储区的内存污染问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2243字,纯文字阅读大概需要4分钟。
内容图文
今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题。
看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题。
先看代码
1 #pragma once 2#pragma execution_character_set("utf-8") 3 #include <iostream> 4 #include <cstdio> 5using std::cout; 6using std::endl; 7 8constint COLUMNS = 8; 9constint ROWS = 8; 10int Matrix[COLUMNS][ROWS] = { 0 }; 1112void print() 13{ 14for (int row = 0; row < ROWS; ++row) 15 { 16for (int col = 0; col < COLUMNS; ++col) 17 { 18 cout << Matrix[row][col] << ""; 19 } 20 cout << endl; 21 } 22 cout << endl; 23} 2425bool check(int row, int col) 26{ 27//检查列28for (int r = 0; r < row; ++r) 29 { 30if (Matrix[r][col]) 31returnfalse; 32 } 33for (int r = row - 1, c = col - 1; r != -1 && c != -1; --r, --c) 34 { 35if (Matrix[r][c]) 36returnfalse; 37 } 38for (int r = row - 1, c = col + 1; r != -1 && c != COLUMNS; --r, ++c) 39 { 40if (Matrix[r][c]) 41returnfalse; 42 } 43returntrue; 44} 454647void writeQueen(int currentRow) 48{ 49staticint count = 0; 50if (currentRow == ROWS) 51 { 52 ++count; 53 cout << count << endl; 54 print(); 55//return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。56 } 5758int col = 0; 59for (; col < COLUMNS; ++col) 60 { 61 Matrix[currentRow][col] = 1; 62//print();63if (check(currentRow, col)) 64 writeQueen(currentRow + 1); 65 Matrix[currentRow][col] = 0; 66 } 67} 6869int main() 70{ 71 writeQueen(0); 72 }
运行出来后结果是这样的:
即每个结果的序号都是1,明显不符合我的意图。
之后就是寻找错误原因了,定位到这一段代码上:
1 void writeQueen(int currentRow) 2{ 3staticint count = 0; 4if (currentRow == ROWS) 5 { 6 ++count; 7 cout << count << endl; 8 print(); 9//return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。10 } 1112int col = 0; 13for (; col < COLUMNS; ++col) 14 { 15 Matrix[currentRow][col] = 1; 16//print();17if (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
内容总结
以上是互联网集市为您收集整理的c++ 中全局/静态存储区的内存污染问题全部内容,希望文章能够帮你解决c++ 中全局/静态存储区的内存污染问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。