如果我在main中声明一个对象,那么调用该类的成员函数(在函数内部我使用operator new来声明另一个类的对象),该嵌套对象是否仍然保留在范围之后成员函数调用?换句话说,我可以在整个主要使用那个对象吗?我打算创建一个指针向量,并为每个位置分配一个由类的函数调用创建的新对象。
提前谢谢!如果我的问题含糊不清,请告诉我。 附:如果我必须在.h文件中定义析构函数来删除用new创建的内容,对吗?这不是由编译器自动完成的?
int main()
{
Ship *list[5] = { 0, 0, 0, 0, 0 };
char ch;
int x1,y1,x2,y2;
int n = 0;
cin >> ch >> x1 >> y1 >> x2 >> y2;
while ( cin )
{
try
{
Ship *p = Ship::makeShip(ch,x1,y1,x2,y2);
list[n++] = p;
}
在我的程序中,makeShip返回一个指向新Ship对象的指针。为什么我可以在我的main()中使用Ship对象?在第二次结束后,我认为它超出范围尝试?谢谢!
答案 0 :(得分:1)
使用new
创建的任何内容仍然存在,直到您使用delete
销毁它。因此,对象仍然在范围内,只要您有引用该对象的引用,就可以访问它。
automatic
之后只有}
个变量超出范围。在您的情况下,您可以通过Ship
访问list
个对象。
虽然我建议使用std::array<Ship>
或std::vector<Ship>
代替Ship *[]
编辑
在编辑问题并添加一些代码部分之后,Ship
对象的范围是否会在}
之后结束取决于什么和Ship::makeShip
如何返回。
答案 1 :(得分:1)
在这种情况下,它取决于Ship::makeShip
的实现。
makeShip
将指针存储到某个存储区(例如static std::vector
个std::unique_ptr
指针),则在退出程序后将清除内存。
在这种情况下,您无需手动删除list
,因为您只有引用。Ship::makeShip
返回一个需要手动删除的指针。在这种情况下,应该调用所有列表项delete
运算符。最后一个,
返回原始指针是不好的做法,目前还不清楚如何处理它,何时删除,谁拥有等等。
最好返回std::unique_ptr
或std::shared_ptr
。
在第一种情况下,很明显您成为指针的所有者。在第二种情况下,拥有者并不重要,因为所有权是共享的