双重删除,内存泄漏和堆栈内存删除有什么区别?造成这些错误的条件是什么?我在提到问题5 on this test时提出这个问题。对于这些东西,我不太熟悉什么是良好的练习与不良练习,所以任何指导/提示都会受到赞赏!
答案 0 :(得分:1)
引用的链接有一个已经有答案的测试,所以我不认为进一步澄清测试的答案会有助于作弊。
对于每次调用new,正确的程序总是会执行一次删除调用。所有这些都违反了这条规则。
双重删除调用多次删除。
A* p = new A;
if ( someOption )
delete p;
... more code ...
delete p; // p is double freed if someOption is true
return;
内存泄漏根本不会调用delete。
A* p = new A;
if ( someOption )
delete p; // p leaked if someOption is not true
return;
删除堆栈内存调用删除未从new返回的内存。
A a;
A* p;
if ( someOption )
p = &a;
else
p = new A;
delete p; // p is deletion of stack memory if someOption is true