在C++中混淆了delete关键字opearation

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)

sta*_*ust 5

delete实际上并没有使它指向的内容无效.它告诉操作系统,内存可以用于其他内容,程序不再需要它.

如果它没有被其他数据覆盖,您的数据仍然会在内存中,并且仍然可以访问.这是许多错误的原因,这些错误在开发阶段未被发现并且稍后出现.

现在正在运作的事实并不意味着它将始终有效.例如,如果将代码移动到另一台计算机,或者重新启动计算机,则代码可能会出现段错误.

将指针设置为NULLafter后总是一个好习惯delete.甚至更好用smart pointers.

  • `delete`可以使它指向的内容无效,它只是没有按照标准.这是一个实现细节. (2认同)