Jim*_*mmy 15 c++ memory-leaks undefined-behavior
因此,为了更好地理解新/删除(真的用小例子向我自己证明为什么接口需要虚拟析构函数),我想了解内存泄漏,以便我可能生活在对它们的恐惧中.但是我很难接触到泄漏,可以这么说; 实际上,我也很难用new/delete.
这是我最简单的版本:
int* P1 = new int(43);
cout<<"P1 = "<<P1<<endl;
cout<<"*P1 = "<<*P1<<endl;
delete P1;
cout<<"P1 = "<<P1<<endl;
cout<<"*P1 = "<<*P1<<endl;
Run Code Online (Sandbox Code Playgroud)
这打印:
P1 = 0xcc0340
*P1 = 43
P1 = 0xcc0340
*P1 = 43
Run Code Online (Sandbox Code Playgroud)
我在课堂上有一些更复杂的东西,但是这个例子说明了我的失败.我认为删除需要一个指针并释放它的内存,从而使指针无效或至少它指向什么?我必须做一些非常简单的事情.
Ker*_* SB 25
您正在导致未定义的行为.这意味着任何事情都可能发生.由于确实发生了某些事情,所有事情都表现得有记录.(有时候"某些东西"看起来非常类似于你可能错过的其他东西.完全按照你认为你想要实现的东西是"未定义行为"可能允许的实例之一.)
另请注意,"内存泄漏"与您尝试执行的操作相反 - 在内存泄漏中您忘记释放内存,而您已经释放内存并且现在正在访问无效内存.
这里是一个真正的内存泄漏,也不会不引起未定义行为-不要混淆"不错,但正确"与"不正确"节目!
int * factorial(int * n)
{
if (*n == 0) return new int(1);
else return new int(*n * *factorial(*n - 1));
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*utz 23
我必须做一些非常简单的事情.
你是绝对正确的.你的代码正在做一些非常简单的非常错误的事情,并且你付出了最终的代价 - 没有看到任何负面结果.有时,你做错了事,没有什么不好的事情发生.这是最糟糕的结果,因为您可能没有意识到您的代码是错误的,并且您将继续使用它,直到有一天您的代码意外中断,并且您将不知道在哪里或如何,因为它始终有效.它会破坏与错误的实际部分完全无关的某个地方,你会花费数小时试图追踪它并弄清楚它为什么会被打破.
当你做错事时,它是未定义的行为.这意味着一切都会发生.充其量,你的代码崩溃,段错误和闪烁的灯亮起来,说"你正在使用自由记忆",一切都很清楚.在最坏的情况下,恶魔会飞出你的鼻子.但正好在这之上,第二个可能的结果是一切看起来都像你想要的那样有效.
这将是内存泄漏:
int* P1 = new int(43);
P1 = new int(42);
Run Code Online (Sandbox Code Playgroud)
分配内存而不再删除它.
| 归档时间: |
|
| 查看次数: |
1128 次 |
| 最近记录: |