gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:37:39 24 4
gpt4 key购买 nike

如果我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com