如果我在main中声明一个对象,然后调用该类的成员函数(同时在函数内部,我使用new运算符声明另一个类的对象),那么在成员函数调用之后,该嵌套对象是否仍保留在作用域中?换句话说,我是否可以在整个main中使用该对象?我将创建一个指针向量,并为每个位置分配一个由类的函数调用创建的新对象。
先感谢您!如果我的问题不清楚,请告诉我。
附言如果必须在.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对象?我认为第二个}结束大括号后它就超出范围了吗?谢谢!!
最佳答案
在这种情况下,它取决于Ship::makeShip
的实现。
如果makeShip
将指针存储到某个存储器中(例如static std::vector
指针的std::unique_ptr
),则在退出程序后将清除内存。
在这种情况下,您不需要手动删除list
,因为您只有引用。Ship::makeShip
返回一个指针,您需要手动删除它。在这种情况下,对于所有列表项,应调用delete
运算符。
最后一个
返回原始指针是一种不好的做法,目前还不清楚如何处理原始指针,何时删除,谁拥有等等。
最好返回例如std::unique_ptr
或std::shared_ptr
。
在第一种情况下,很明显,您成为指针的所有者。在第二种情况下,谁拥有并不重要,因为所有权是共享的