![]() |
1
20
指针的STL容器不会清除指向的数据。它只会清理容纳指针的空间。如果希望向量清理指针数据,则需要使用某种智能指针实现:
当作用域结束时,两个向量将释放其内部数组。v1将泄漏创建的SomeClass,因为数组中只有指向它的指针。v2不会泄漏任何数据。 |
![]() |
2
5
如果你有
知道C++不做垃圾收集,这是为什么(语法错误的错误,我写C++以来有一段时间)的例子:
最后一行(
(如果你想要一个在destroy上删除指针的向量类型,当然可以编写这样的类型。可能已经编写过。但是要小心删除其他人仍持有其副本的指针。) |
![]() |
3
3
当向量超出范围时,编译器会发出对其析构函数的调用,从而释放堆上分配的内存。 |
![]() |
4
3
虽然是可配置的,但#2几乎总是存在于堆中#但是,1可以存在于堆栈或堆上,这取决于它的分配方式。例如
那么#2是如何被摧毁的呢?当向量的第一部分被破坏时,它也会破坏第二部分。这是通过删除vector类的析构函数中的底层数组来完成的。 |
![]() |
5
2
如果将指针存储在STL容器类中,则需要在销毁对象之前手动删除它们。这可以通过在整个容器中循环并删除每个项来完成,或者通过使用某种智能指针类来完成。但是,不要使用auto_ptr,因为这根本不适用于容器。 这样做的一个好的副作用是,您可以在程序中保留多个指针容器,但这些对象只属于其中一个容器,您只需要清理这一个容器。
|
![]() |
6
2
使用向量内部的智能指针,或者使用boost的ptr_向量。它将自动释放其中分配的对象。还有地图、布景等。 http://www.boost.org/doc/libs/1_37_0/libs/ptr_container/doc/ptr_vector.html 主站点: http://www.boost.org/doc/libs/1_37_0/libs/ptr_container/doc/ptr_container.html |
![]() |
7
0
|
![]() |
8
0
要回答您的第一个问题: STL类没有什么特别之处(我希望如此)。它们的功能与其他模板类完全相同。因此,如果在堆上分配它们,它们不会自动销毁,因为C++没有垃圾收集(除非您用一些华丽的自动操作或某些东西告诉它)。如果将其分配到堆栈(没有新的),它很可能会被C++自动管理。 对于第二个问题,这里有一个非常简单的ArrayOfTen类来演示C++中典型内存管理的基础知识:
对于大多数(所有?)STL类型,调整大小是在幕后进行的,以确保有足够的内存集分配给您的元素。上面的类只支持十个对象的数组。它基本上是一个非常有限的对象类型[10]。 |
![]() |
9
0
但是,当向量的内容要。。。嗯。。。共享。对 |
![]() |
11
0
标准STL容器使用复制构造函数将原始对象的副本放置到容器中。当容器被销毁时,还会调用容器中每个对象的析构函数来安全地销毁该对象。
还应该指出,容器中的智能指针是一种有效的替代方法,不幸的是std::auto_ptr<&燃气轮机;对于这种情况,不是有效的智能指针选择。
|
![]() |
12
0
STL容器与任何其他对象类似,如果您实例化一个,它将在堆栈上创建:
与任何其他堆栈变量一样,它只存在于定义它的函数的范围内,不需要手动删除。STL容器的析构函数将调用容器中所有元素的析构函数。
那么,您应该将什么内容放入容器中,而不是原始指针+1个jmucchiello用于启动boost::shared_ptr。在STL容器中使用boost::shared\u ptr是安全的(与std::auto\u ptr不同)。它使用一个简单的引用计数机制,可以安全地用于不包含循环的数据结构。
|
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |