关于与新运营商C++的范围
Regarding scope in C++ with new operator
如果我在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
的实现。
- 如果
makeShip
将指针存储到某个存储中(例如static std::vector
std::unique_ptr
指针),则从程序退出后将清除内存。在这种情况下,您不需要手动删除list
,因为您只有引用。 -
Ship::makeShip
返回一个指针,您需要手动删除该指针。在这种情况下,对于所有列表项delete
应调用运算符。
最后一个,
返回原始指针是一种不好的做法,真的不清楚如何处理它,何时删除,谁拥有等等。
例如返回std::unique_ptr
或std::shared_ptr
会更好.
在第一种情况下,很明显您成为指针的所有者。在第二种情况下,谁拥有并不重要,因为所有权是共享的
任何
用new
创建的东西都会一直存在,直到你用delete
摧毁它。因此,对象保留在范围内,只要您有引用该对象的引用,您就可以访问它。
只有automatic
变量在}
之后超出范围。在您的情况下,您可以通过 list
访问Ship
对象。
虽然我会推荐std::array<Ship>
或std::vector<Ship>
而不是Ship *[]
编辑
问题并添加一些代码部分后,Ship
对象的作用域是否会在}
后结束取决于Ship::makeShip
返回的内容和方式。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何访问超出其块范围的对象?
- 矢量下标超出SFML游戏中的范围