【发布时间】:2016-10-10 20:33:27
【问题描述】:
我有以下代码。
#include <string.h>
#include <iostream>
using namespace std;
class Fred
{
private:
char* _cptr;
public:
Fred()
{
_cptr = new char[strlen("Hello World") + 1];
strcpy(_cptr, "Hello World");
}
~Fred()
{
cout << "Fred::~Fred(): " << _cptr << endl;
delete _cptr;
}
void Display() const
{
cout << "Fred::Display() _cptr: " << _cptr << endl;
}
};
int main()
{
Fred* p = new Fred();
if (p == NULL)
cout << "fail" << endl;
p->Display() ;
p = NULL;
delete p;
getchar();
return 0;
}
输出 Fred::Display() _cptr: Hello World 009A02D8
int main()
{
Fred* p = new Fred();
if (p == NULL)
cout << "fail" << endl;
p->Display() ;
//p = NULL;
delete p;
getchar();
return 0;
}
输出 Fred::Display() _cptr: Hello World Fred::~Fred(): Hello World
关于为什么析构函数在 First Case(p = NULL) 中不起作用的任何想法。
谢谢 地图
【问题讨论】:
-
切换这些行:
p = NULL; delete p;delete NULL;是一个 NOP,您正在泄漏原始实例。 -
为什么会这样?你没有删除
new返回的指针。 -
不同意“关闭为拼写错误”的投票 - 在我看来,OP 故意以这种方式编写代码并且不理解它的含义
-
@M.M 正如 @Baum 所说。这是微不足道的。
-
@πάνταῥεῖ 但这不是“无法再重现的问题”,也不是“简单的印刷错误”。
标签: c++ c++11 memory-management