【发布时间】:2013-04-29 12:35:52
【问题描述】:
我想知道删除是如何工作的?
在主要功能中,我删除了cfactobject。但是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;
}
【问题讨论】:
-
您预计会发生什么?您正在对已删除对象调用函数。这是未定义的行为,任何事情都可能发生,包括打印输出。
-
@PeterWood:我希望
cfact->Hello();失败。无意间看到了这种行为。所以,我无法理解我想问的问题。 -
你应该使用虚拟析构函数
标签: c++ new-operator factory-pattern virtual-functions delete-operator