2017-03-23 49 views
0

我帮我朋友与调试代码,有问题的部分是类似的东西:为什么delete []会导致堆损坏错误?

当然
class MyClass { 
    char * text; 
public: 
    MyClass(const char * c) { 
     if (c != nullptr) { 
      text = new char[strlen(c)]; 
      strcpy(text, c); 
     } 
     else 
      text = nullptr; 
    } 
    ~MyClass() { 
     delete[] text; 
    } 
}; 


int main() { 
    MyClass foo("bar"); 
    return 0; 
} 

问题是strlen(c),应该是strlen(c) + 1。无论如何,令我惊讶的是,为什么在析构函数中调用delete []的时候会导致堆损坏错误?是什么造成的?

这个错误是由调试器引发的,我的问题是: 为什么在释放内存的时候弹出这个错误,而不是早些时候? 以这种方式查找代码中的任何错误会容易得多。有一个我不小心写了这个错误,(抱歉,我没有注意到,现在这就是我的意思)。事情是,在这个任务中禁止使用字符串,所以必须使用C语言。 对不起,这么多的编辑。我真的必须学会如何提出确切的问题。

+11

最有可能你违反了[规则3](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree) – NathanOliver

+1

@someprogrammerdude“*当然问题是与strlen( c),应该是strlen(c)+ 1. *“。 –

+5

'c = nullptr'你可能是指'text = nullptr'那里。 .. –

回答

1

为什么在释放内存的时候弹出这个错误,而不是在更早?

从经验来看,发生损坏时不一定会在Visual Studio中检测到堆损坏。腐败之后你不能依靠检测发生。尽管在这种情况下,在下次可能的时间检测到腐败。 Visual Studio只会在您分配或释放内存时进行检查。

2

堆腐败是通过调用strcpy导致,它写在已分配内存块的末尾。当检测到时,代码为delete[]