gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:28 24 4
gpt4 key购买 nike

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


这是我的类(class)大纲:

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

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

当 vector 中的元素是对象时,这可能会导致严重的资源泄漏。我对这个问题的解决方案是,在我free() 内存之前调用~T() EXPLICITLY

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

问:那是一个糟糕的设计吗? std::vector 如何解决这个问题?我的 vector 类是否还有其他缺陷?

PS:malloc()的多线程性能暂且不谈

最佳答案

调用 ~T() 正是 std::vector 处理问题的方式。

但是你确实有几个问题:

首先,push_back 需要使用 placement new 将值复制构造到 vector 中。你不能只使用赋值。

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

(实际上,std::vector 本身并不调用 ~T()。相反,它调用了负责... 分配的分配器 和释放内存。不过在内部,通用分配器就是这样做的。)

关于c++ - std::vector 如何破坏它的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38878133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com