Memory leaks 具有功能的内存泄漏
___当在“delete p”和“p=NULL”之后调用MyClass::processing时,下面的程序应该会崩溃,但当尝试访问“MyClass::a”时,它会崩溃。为什么会这样Memory leaks 具有功能的内存泄漏,memory-leaks,Memory Leaks,___当在“delete p”和“p=NULL”之后调用MyClass::processing时,下面的程序应该会崩溃,但当尝试访问“MyClass::a”时,它会崩溃。为什么会这样 #include <iostream> using namespace std; class MyClass { public: int a; void processing() { cout<<"Proces
#include <iostream>
using namespace std;
class MyClass
{
public:
int a;
void processing()
{
cout<<"Processing"<<endl;
}
};
int main(void)
{
MyClass* p(new MyClass);
MyClass* q = p;
p->a = 10;
cout<<"p:: "<<p<<" q:: "<<q<<endl;
cout<<"p->a"<<p->a<<"q->a"<<q->a<<endl;
delete p;
p->processing(); // Watch out! p is now dangling!
cout<<"\n\nAfter Deletion::"<<endl;
cout<<"p:: "<<p<<" q:: "<<q<<endl;
cout<<"p->a"<<p->a<<"q->a"<<q->a<<endl;
p = NULL; // p is no longer dangling
cout<<"\n\nAfter Assigning null"<<endl;
p->processing(); // Watch out! p is now dangling!
q->processing(); // Ouch! q is still dangling!
cout<<"p:: "<<p<<" q:: "<<q<<endl;
}
#包括
使用名称空间std;
类MyClass
{
公众:
INTA;
无效处理()
{
cout删除实例后调用方法是未定义的行为。任何情况都可能发生
可能的行为示例:
您得到了“幸运”:free
刚刚释放了内存,但没有使其失效。实例部分完好无损,调用意外成功
free
用垃圾(或sentinel值)覆盖内存,导致您跳转到某个疯狂的地址并出错
free
取消分配整个块,您在尝试访问*p
时会出错
其他一些线程将系统
的地址放在现在未使用的内存块中。堆栈恰好包含一个指向“rm-rf/”
的指针。硬盘被擦除,欢闹随之发生
永远,永远,永远不要依赖未定义的行为