【问题标题】:Regarding scope in C++ with new operator关于使用 new 运算符的 C++ 范围
【发布时间】:2015-01-14 01:42:19
【问题描述】:

如果我在 main 中声明一个对象,然后调用该类的成员函数(在函数内部,我使用 operator 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 析构函数,您必须使用智能指针,例如 std::unique_ptr<Ship> list[5];
  • @TonyD 对不起,我读到了cout

标签: c++ arrays constructor scope destructor


【解决方案1】:

在这种情况下,它取决于Ship::makeShip 的实现。

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

最后一个,

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

最好返回std::unique_ptrstd::shared_ptr

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

【讨论】:

  • 我对 C++ 的了解还不是很深,但是谢谢。你能详细说明你对#1所说的话吗?我基本上从这篇文章中了解到,使用 New 创建的任何内容都将具有全局范围,直到程序结束或调用 delete 运算符?
  • 如果你使用 new 操作符,那么内存只能被调用 delete 操作符或者模块死掉(从 exe 文件退出或卸载 dll 库)
【解决方案2】:

使用new 创建的任何内容都将保持活动状态,直到您使用delete 将其销毁。所以对象仍然在作用域内,只要你有一个引用来引用这个对象,你就可以访问它。

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

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

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

【讨论】:

  • 我想这回答了我的问题!此外,即使我的班级中只有〜destructor,该对象也不会自动销毁,对吗?我需要写删除代码吗?
  • 非常感谢!我很感激。那么您的回答是否适用于我的问题?如果我在 main 中的函数内调用 new,那么该新对象具有全局范围?
  • 是的,对象具有全局范围。确保最后删除所有船舶。 for(int i = 4; i >= 0; --i) {delete list[i]; list[i] = 0;}
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 2011-01-21
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多