在第一个示例中,您最终将不得不删除a
and ,但在超出范围b
时不一定要删除。通常你会在超出范围units
之前这样做,但这不是唯一可能的情况。units
这取决于目的是什么。
您可能(稍后在同一个函数中)别名a
or b
,或两者兼而有之,因为您希望它们比units
函数范围更有效。您可以同时将它们放入两个unit
对象中。或者,许多其他可能的事情。
重要的是销毁向量(在这种情况下在作用域结束时自动)会销毁向量持有的元素,仅此而已。元素是指针,销毁指针没有任何作用。如果您还想销毁指针指向的内容(以不泄漏内存),则必须手动执行此操作(for_each
使用 lambda 即可)。
如果您不想明确地完成这项工作,智能指针可以为您自动完成。
第二个示例(在 Edit1 下)不需要您删除任何内容(事实上这甚至是不可能的,您可能会看到尝试这样做的崩溃),但这种方法可能是有害的。
只要您在units
之后a
和b
离开范围内不再引用任何内容,该代码就会运行良好。不幸的是,如果你这样做。
从技术上讲,这样的事情甚至可能在不可见的情况下发生,因为units
在 之后被销毁a
,但幸运的是,~vector
它不会取消引用指针元素。它只是销毁它们,对于指针没有任何作用(微不足道的析构函数)。
但是想象一下某人是如此“聪明”以至于扩展了向量类,或者也许你在未来的某一天应用这种模式(因为它“工作正常”)到另一个这样做的对象。砰,你死定了。你甚至不知道它是从哪里来的。
我真正不喜欢代码的地方,即使它是严格“合法的”,它可能会导致崩溃或表现出损坏的、不可重现的行为的情况。但是,它不会立即崩溃。“损坏”的代码应该立即崩溃,因此您会发现有问题,并且您被迫修复它。不幸的是,这里不是这种情况。
这似乎会起作用,可能会持续数年,直到有一天它不起作用。最终你会忘记这一点,a
并b
住在当前的堆栈帧上,并从其他位置引用向量中不存在的对象。也许您在代码的未来版本中动态分配向量,因为您将它传递给另一个函数。也许它会继续看起来有效。
然后,您将花费数小时(可能还有其他人的时间)试图找出为什么一段不可能失败的代码会产生错误的结果或崩溃。