如果我在 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
的实现。
- 如果
makeShip
将指针存储到一些存储中(例如std::unique_ptr
指针的static std::vector
),那么内存将是退出程序后清零。 在这种情况下,您不需要手动删除list
,因为您只有引用。 Ship::makeShip
返回一个您需要手动删除的指针。在这种情况下,对于所有列表项,都应调用delete
运算符。
最后一个,
返回原始指针是不好的做法,真的不清楚如何处理它,何时删除,谁拥有等等。
最好返回例如 std::unique_ptr
或 std::shared_ptr
。
在第一种情况下,很明显您成为指针的所有者。在第二种情况下,谁拥有并不重要,因为所有权是共享的
关于c++ - 关于使用新运算符的 C++ 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26967712/