c++ - 关于使用新运算符的 C++ 范围

标签 c++ arrays constructor scope destructor

如果我在 main 中声明一个对象,然后调用该类的成员函数(在函数内部我使用 operator new 来声明另一个类的对象),在成员函数调用之后,该嵌套对象是否仍保留在作用域中?换句话说,我还能在整个 main 中使用那个对象吗?我打算创建一个指针 vector ,并为每个位置分配一个由类的函数调用创建的新对象。

提前谢谢你!如果我的问题含糊不清,请告诉我。 附言如果我必须在 .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 将指针存储到一些存储中(例如 std::unique_ptr 指针的 static std::vector),那么内存将是退出程序后清零。 在这种情况下,您不需要手动删除 list,因为您只有引用。
  2. Ship::makeShip 返回一个您需要手动删除的指针。在这种情况下,对于所有列表项,都应调用 delete 运算符。

最后一个,

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

最好返回例如 std::unique_ptrstd::shared_ptr

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

关于c++ - 关于使用新运算符的 C++ 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26967712/

相关文章:

c++ - move 构造函数的问题

c++ - 为什么我不能使用 makefile 正确包含此文件?

c++ - 使指针的中间为 NUL;它有效吗?

c++ - C++11 中的几个数组

c++ - 连接一系列 std::arrays

c++ - 从指针打印动态 int 数组获取奇怪的字符

php - 构造函数返回值?

php - C++/PHP 中的网络机器人

c++ - 如何从字符数组中提取数字字符串成员

c++ - 为什么在我分配该类的两个对象时调用我的构造函数?