std :: vector如何破坏它的对象?

Kel*_*ang 5 c++ memory-management vector

为了练习,我正在尝试实现自己的std :: vector.当前源代码:http://pastebin.com/bE4kjzcb


这是我班级的概要:

  1. Array() 使用分配一些内存 malloc()
  2. push_back(const T &t)添加一个元素,realloc()必要时调用.
  3. ~Array()打电话free()给释放记忆.

这个模型的主要问题是,free()回收内存,但它不会调用T析构函数(何时T是类而不是标准数据类型).

当向量内的元素是对象时,这可能导致严重的资源泄漏.我解决这个问题的方法是,在内存之前调用~T() EXPLICITLYfree().

我正在使用的原因malloc()是,我正在努力利用realloc().如果我使用newdelete,重新分配时内存使用率将达到峰值.(新缓冲区和旧缓冲区都存在的时刻.)

问:这是一个糟糕的设计吗?怎么std::vector解决这个问题?我的矢量类中还有其他缺陷吗?

PS:我们暂不谈malloc()现在的多线程表现.

Mar*_*ica 5

呼唤~T()究竟是如何std::vector处理的问题.

但是你有几个问题:

首先,push_back需要使用placement new来将值复制 - 构造到向量中.你不能只使用作业.

其次,你不能调用realloc- 如果对象有内部指针,它们将最终指向自己的外部.您必须malloc再次调用,然后使用placement new来复制构造值,然后显式删除所有旧值,然后调用free以释放旧值.

(实际上,std::vector它不会调用~T()自身.相反,它会调用负责... 分配和释放内存的分配器.但在内部,这就是通用分配器的工作方式.)