关于与新运营商C++的范围

Regarding scope in C++ with new operator

本文关键字:C++ 范围 运营商      更新时间:2023-10-16

如果我在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的实现。

  1. 如果makeShip将指针存储到某个存储中(例如static std::vector std::unique_ptr指针),则从程序退出后将清除内存。在这种情况下,您不需要手动删除list,因为您只有引用。
  2. Ship::makeShip返回一个指针,您需要手动删除该指针。在这种情况下,对于所有列表项delete应调用运算符。

最后一个,

返回原始指针是一种不好的做法,真的不清楚如何处理它,何时删除,谁拥有等等。

例如返回

std::unique_ptrstd::shared_ptr会更好.

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

任何

new创建的东西都会一直存在,直到你用delete摧毁它。因此,对象保留在范围内,只要您有引用该对象的引用,您就可以访问它。

只有automatic变量在}之后超出范围。在您的情况下,您可以通过 list 访问Ship对象。

虽然我会推荐std::array<Ship>std::vector<Ship>而不是Ship *[]

编辑

编辑
问题并添加一些代码部分后,Ship对象的作用域是否会在}后结束取决于Ship::makeShip返回的内容和方式。