我刚刚做了什么? C ++中的内存泄漏?

时间:2015-07-05 10:47:11

标签: c++ memory

不确定我做了什么/没做什么,但它给了我疯狂的结果!

这是代码......

#include <iostream>
using namespace std;

int counter = 0;
int trigger = 0;

int main(){
    while(1)
    {
    if (counter == trigger)
       {
       cout << "Beep\n" + counter;
       counter = 0;
       trigger = (rand() % 20000000);
       }
    counter++;
   }
return 0;
}

看起来很简单吧?运行它,看看会发生什么!

我从扬声器中听到一声可听见的声音,并对此表示欢迎......

enter image description here

任何想法??

-Adrian

2 个答案:

答案 0 :(得分:4)

本声明

cout << "Beep\n" + counter;
counter大于sizeof( "Beep\n" )时,

具有未定义的行为,因为这是尝试访问字符串文字之外的内存。

也许你的意思是以下

cout << "Beep\n" << counter << endl;

cout << "Beep " << counter << endl;

在任何情况下,都不需要将变量countertrigger声明为全局变量。

而不是

int counter = 0;
int trigger = 0;

int main(){
//...
你可以写

int main(){
    int counter = 0;
    int trigger = 0;
//...

答案 1 :(得分:3)

"Beep\n" + counter会导致"Beep\n"衰减到指向第一个字符'B'的指针,并将该指针偏移counter

例如,

  • 如果counter = 0"Beep\n" + 0评估为"Beep\n"
  • 如果counter = 1"Beep\n" + 1评估为"eep\n"(指向第二个字符),
  • 如果counter = 2"Beep\n" + 2评估为"ep\n"

直到你在counter > 4之后阅读不属于你的记忆。

这不是内存泄漏,那是未定义的行为