【问题标题】:Deleting an object in C++ deletes objects inside the deleted object?在 C++ 中删除对象会删除已删除对象内的对象吗?
【发布时间】:2013-11-18 03:16:53
【问题描述】:

我有一个游戏类、立方体类和一个解决方案类。在我的主要功能中,我正在创建一个游戏对象 g 并且该游戏对象具有一组立方体类型对象和一堆解决方案类型对象。在 main 函数中,在退出之前,我通过调用 delete[] g; 来删除对象 g;

我想知道这是否会删除数组和堆栈中的所有对象?或者我还会有内存泄漏吗?

示例代码:

int main(void)
{

Game* g = new Game();
//Do something like addCube by calling functions in game

delete g;
}

游戏构造器:

public: Game()    
    {    
        int nx;    
        cout<<"Enter the number of cubes in the game ";    
        cin>>nx;    
        this->numOfCubes=nx;    
        cubes = new Cube[nx];        
        this->ref=0;    
    }

游戏功能示例

    void Game::addCube()
{    
    if(ref<numOfCubes)
    {   
        cubes[ref].getSides();      
        ref++;   
        cubes[ref]->Sno = ref;    

    }
    else
        cout<<"All the cubes are already in the game"<<endl;
}

【问题讨论】:

  • 我认为您需要提供一些示例代码,以便我们知道您真正在说什么。 sscce.org
  • @FredLarson:添加代码

标签: c++ object


【解决方案1】:

如果您谈论的是一组实际对象,那么是的,它们将被正确销毁。如果您有一个指针数组,则必须删除每个对象(假设每个对象都是使用 new 创建的)。

编辑:

好吧,你有麻烦了:

int main(void)
{

Game* g = new Game();
//Do something like addCube by calling functions in game

delete[] g;
}

g 不指向数组,只是一个实例。所以delete [] g; 是未定义的行为。应该只是delete g; 更好的是,根本不要使用动态分配:

int main(void)
{

Game g;
//Do something like addCube by calling functions in game

// No delete necessary since you're using automatic allocation.
}

至于您的cubes 数组,您必须删除数组本身,因为它是使用new [] 创建的。请务必使用delete [] cubes;。但是正如 Blastfurnace 所指出的,您正在泄漏 addCube() 中的立方体。我认为您正在尝试做一个动态数组,在这种情况下,std::vector 将是您最好的朋友。

【讨论】:

    【解决方案2】:

    无论您遇到什么其他问题,您的addCube() 函数都有缺陷。添加评论:

    {
        Cube* c = new Cube(); // allocate a Cube object
        c->getSides();
        cubes[ref]=*c; // dereference pointer and store a copy of the object
        ref++;
        c->Sno = ref; // modify allocated Cube (not the same object as cubes[ref])
    }
    // pointer c goes out of scope and you leak the allocated memory
    

    没有理由在这段代码中使用new

    【讨论】:

    • @user3000837:它看起来更正确,但我认为你想要cubes[ref].Sno = ref。由于数组包含对象而不是指针,因此您应该只使用 . 而不是 -&gt; 运算符。
    • 是的,我这样做了,我正在使用 delete[] g->cubes;删除 g;在退出游戏之前避免任何类型的内存泄漏。现在正朝着正确的方向前进吗?
    • @user3000837:请记住,每个newnew[] 都必须在代码中的某处有一个匹配的deletedelete[]。我的建议是避免手动内存管理,除非你别无选择。当您确实需要动态容器时,请从 std::vector 或其他标准 C++ 容器开始。它将让您专注于代码而不是繁琐的资源管理。
    【解决方案3】:

    内部对象不会持久化,但是如果你知道每次都想删除内部对象,你可以在类定义中创建~ClassName()风格的析构方法,在这个析构方法中,你可以调用析构方法对于您要删除的每个内部对象。请记住,如果这些对象存在于您的代码中的其他位置,您将获得意外行为或更可能是段错误。

    【讨论】:

      【解决方案4】:

      如果对象的析构函数手动对每个对象执行delete,则对对象调用delete 只会递归删除其中的对象。 c++中没有自动删除或垃圾回收。

      【讨论】:

        猜你喜欢
        • 2017-06-26
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 2013-02-24
        • 2011-01-12
        • 2012-12-16
        相关资源
        最近更新 更多