我有一个连续运行的c ++程序,为了调试它,我使用cout将一些值打印到控制台。这在过去一周一直很好。
然而,现在大约30秒后,它将打印出它无法访问的信息,并停止打印我完全告诉它的内容。
以下是一个例子:
Object 104 dist: 0.111448
Object 104 dist: 0.113334
Object 104 dist: 0.0950752
JRE_HOME=/jreLS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;3^C
在上面的例子中,我告诉程序在每次迭代时都打印“Object dist”,然后它会突然发出它应该无法访问的JRE_HOME信息,然后停止一起打印。除了打印停止,程序继续正常运行。
我担心我可能会遇到某种内存泄漏或缓冲区溢出,但我不知道如何诊断这个,因为我对C ++还不熟悉,并且不知道是什么导致了这一点(我查看过了最近的代码更改,并没有什么突出的明显原因)。
我已经重新启动了我的计算机,但每次只打印出更多随机系统信息,而这些信息无法访问,这再次让我相信它是从系统内存的某些部分读取的。
导致这种情况的原因是什么?
答案 0 :(得分:2)
它不应该有权访问
你错了,每个进程都在其内存空间中有一个环境块的副本。
您正在看到环境变量的片段,因为您使用的是无效指针,该指针恰好位于环境块中而非目标数据中。