如果我在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_ptrstd::shared_ptr

在第一种情况下,很明显,您成为指针的所有者。在第二种情况下,谁拥有并不重要,因为所有权是共享的

07-24 15:19