我有一个游戏类,多维数据集类和一个解决方案类。在我的主要功能中,我正在创建一个游戏对象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;
}
答案 0 :(得分:3)
如果你在谈论一系列实际物体,那么是的,它们将被正确销毁。如果你有一个指针数组,你将不得不删除每个对象(假设每个对象都是用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
将成为你最好的朋友。
答案 1 :(得分:0)
内部对象不会持久存在,但如果您知道每次可以在类定义中创建样式~ClassName()
的析构函数方法时删除内部对象,则可以在此析构函数方法中调用要删除的每个内部对象的析构函数方法。请记住,如果这些对象存在于代码中的其他位置,则会出现意外行为或更可能是段错误。
答案 2 :(得分:0)
在对象上调用delete
只会递归以删除其中的对象,如果该对象的析构函数在每个对象上手动执行delete
。 c ++中没有自动删除或垃圾回收。
答案 3 :(得分:0)
无论您遇到其他任何问题,您的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
。