Mat*_*zar 3 c++ windows stl visual-c++
我从学校工作中获得了一些 C++ 经验。我了解到,除其他外,对象应该作为指针存储在容器(向量、映射等)中。主要原因是我们需要使用 new-operator 和复制构造函数,以便在对象的堆(也称为动态内存)上创建副本。此方法还需要定义析构函数。
但是,从那以后我读到的内容看来,STL 容器似乎已经将它们包含的值存储在堆上。因此,如果我将对象存储为值,无论如何都会在堆上创建一个副本(使用复制构造函数),并且不需要定义析构函数。总而言之,无论如何都会在堆上创建一个副本???
此外,如果(真),那么我能想到的使用指针存储对象的唯一其他原因是减轻复制容器的资源需求,因为指针比整个对象更容易复制。但是,这将需要使用 std::shared_ptr 而不是常规指针,因为您不希望在原始容器被销毁时删除复制容器中的元素。这种方法还可以减少定义析构函数的需要,不是吗?
编辑:要定义的析构函数将用于使用容器的类,而不是用于存储对象的类。
编辑 2:我想一个更精确的问题是:“从内存和资源使用的角度来看,使用 new 运算符将对象存储为指针,而不是普通值,这有什么不同吗?”
避免在容器(而不是指针)中存储完整对象的主要原因是复制或移动这些对象的成本很高。在这种情况下,推荐的替代方法是将智能指针存储在容器中。
所以...
vector<something_t> ................. Usually perfectly OK
vector<shared_ptr<something_t>> ..... Preferred if you want pointers
vector<something_t*> ................ Usually best avoided
Run Code Online (Sandbox Code Playgroud)
原始指针的问题在于,当原始指针消失时,它指向的对象会挂起,导致内存和资源泄漏 - 除非您已明确删除它。C++ 没有垃圾收集,当一个指针被丢弃时,没有办法知道其他指针是否仍然指向该对象。
原始指针是一种低级工具 - 主要用于编写诸如 vector 和 shared_ptr 之类的库。智能指针是一种高级工具。
然而,特别是对于 C++11 移动语义,在向量中移动项目的成本通常非常小,即使对于巨大的对象也是如此。例如,vector<string>即使所有字符串都是兆字节长,a也可以。sizeof(classname)如果对象很大,您最担心移动对象的成本- 如果对象在自身内部而不是在单独的堆分配内存中保存大量数据。
即便如此,您也不总是担心移动物体的成本。如果你从不移动它,移动一个物体的代价是昂贵的并不重要。例如, amap不需要移动项目太多。当您插入和删除项目时,节点(和包含的项目)保持原样,只是链接节点的指针发生了变化。
| 归档时间: |
|
| 查看次数: |
2706 次 |
| 最近记录: |