Ras*_*yak 0 c++ virtual-functions new-operator factory-pattern delete-operator
我想知道删除是如何工作的?在主要功能我删除了cfact object.但仍然是cfact->Hello()工程,而不是抛出错误.在我发现删除时发现的调试时,cfact释放内存.一旦factory* c2fact = newfun.Newfun("c2_fact");行执行cfact获得一些内存位置.
怎么样?请帮助我理解这个概念..
class factory{
public:
virtual void Hello() = 0;
};
class c_fact: public factory
{
public:
void Hello(){
cout << "class c_fact: public factory"<<endl;
}
};
class c2_fact: public factory
{
public:
void Hello(){
cout << "class c2_fact: public factory"<<endl;
}
};
class callFun{
public:
virtual factory* Newfun(string data)
{
if(data == "c_fact")
{return new c_fact;}
else
{return new c2_fact;}
}
};
class newFun:public callFun{
public:
factory* Newfun(string data)
{
if(data == "c_fact")
{return new c_fact;}
else if (data == "c2_fact")
{return new c2_fact;}
}
};
int main()
{
newFun newfun;
factory* cfact = newfun.Newfun("c_fact");
delete cfact; //Deleted the instance
factory* c2fact = newfun.Newfun("c2_fact");
cfact->Hello();//Still it prints the output
c2fact->Hello();
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
delete实际上并没有使它指向的内容无效.它告诉操作系统,内存可以用于其他内容,程序不再需要它.
如果它没有被其他数据覆盖,您的数据仍然会在内存中,并且仍然可以访问.这是许多错误的原因,这些错误在开发阶段未被发现并且稍后出现.
现在正在运作的事实并不意味着它将始终有效.例如,如果将代码移动到另一台计算机,或者重新启动计算机,则代码可能会出现段错误.
将指针设置为NULLafter后总是一个好习惯delete.甚至更好用smart pointers.