【问题标题】:How to Allocate Memory for a Bunch of Objects at One Shot?如何一次性为一堆对象分配内存?
【发布时间】:2016-02-23 22:14:27
【问题描述】:

我正在尝试解析 C++ 中的输入文件。在文件的开头,给出了要读取的行数。读完每一行后,我必须创建一个包含行中数据的对象。我在vector<shared_ptr<MyClass>> 之类的向量中保留了指向每个对象的指针。

我想做的是在知道行数后立即为所有对象分配足够的空间。但是,我想如果我对向量使用reserve() 函数,将分配足够的空间来保存指针而不是对象。

  1. 我应该如何为对象和指针分配空间?
  2. 如果我想在创建对象时使用make_shared(),这将如何改变?换句话说,我应该如何为指针和指针管理器分配足够的空间?

【问题讨论】:

  • 如果您这样做,您将与shared_ptr 共度美好时光。你为什么要shared_ptr?作业要求?
  • 为什么不使用std::string 来保存文件数据?
  • 这不是shared_ptr 的用途。共享指针是允许多个对象共享另一个对象的所有权。这是一种约定,在游戏中拥有皮肤的每个人都使用该对象之前,共享对象不会被删除。这种情况可以通过unique_ptr 管理到一个足够宽的适当大小的单个大缓冲区它不会被过早地销毁或shared_ptr 到所有拥有类拥有的同一个池中。然后向量可以包含指向缓冲区内数据的原始指针,并且没有人会关心。
  • vector<MyClass> 不正是您想要的吗?
  • @Mahdi,只要您不执行任何操作来触发向量数据存储的重新分配,就可以为其他用户提供指向向量元素的指针。

标签: c++ memory heap-memory shared-ptr new-operator


【解决方案1】:

看来Pool Allocation 对你有用。它预先分配大块内存并将稍后创建的对象放置在其中。有一个std::allocate_shared 函数允许您控制在哪里创建std::shared_ptr 和对象的控制块。您还可以为您的类重载member operator new,以在您将其插入向量时强制它使用您的分配器,或者只使用池分配器首先创建对象。

Boost.Pool 是一个现成的池分配器实现。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2022-11-10
    • 2021-07-24
    • 2020-07-26
    • 2019-12-31
    相关资源
    最近更新 更多