【问题标题】:map of pointers OR map of stack objects指针映射或堆栈对象映射
【发布时间】:2014-09-12 09:29:12
【问题描述】:

我被困在 map_of_pointers 或 map_of_stack_objects (甚至是 shared_ptrs 的地图。) 地图上的主要操作是插入/删除/搜索项目。

谁能帮我解决这个问题? 提前致谢。

回答您的问题:-

Class Cache
{
private:   
 A map with key as int and value as AccountDetails
public:
 createitem
 deleteItem
 updateItem
 searchItem
};

class AccountDetails
{
AccountData a;  ( 20 bytes )
personalData b;  ( 20 bytes )
list < positions > c ( Each position is 20 bytes )
}

我相信我已经解释得足以回答这个问题了。如果我仍然缺少某些东西,请告诉我,我会添加它。

【问题讨论】:

  • 在没有更多信息的情况下无法回答,您甚至没有告诉我们这些对象是什么
  • 你打算用地图做什么?你的用例是什么?这将是你的决定者。
  • @ravi089: 只需使用map&lt;int, AccountDetails&gt; 开头 - 几乎不可能写得这么糟糕会崩溃 - 对初学者总是有好处 - 然后切换到智能指针(或了解移动语义)稍后,如果您发现性能很差,因为在将 AccountDetails 对象复制到 map 和从 map 中复制出来时存在不必要的临时对象。
  • 谢谢 TonyD。看来我需要为此使用 boost::shared_ptrs 的地图......我对吗?或者在使用 shared_ptr 的地图时您是否还有其他顾虑

标签: c++ stl


【解决方案1】:

这是一个从臀部拍摄的答案,希望对您有所帮助。

使用某种共享指针意味着您在销毁映射时内存泄漏的可能性较小。堆栈对象的映射是什么意思?你想让地图包含指向堆栈上的东西的指针(裸的或智能的)吗?不是一个好主意。 当向 map 添加新的 key,value 时,pair 存储在堆中(std::map 实现为红黑树),因此 pair 不会在堆栈中。

【讨论】:

  • 通过“堆栈对象映射”我的意思是您只是在映射中存储普通对象
  • @ravi089: 这显示了一个基本的误解......实际的map 对象可能在堆栈上,也可能不在堆栈上,但它总是为它包含的元素动态分配内存......他们'永远不会在堆栈上,即使它们是通过复制堆栈上的值来插入的。
【解决方案2】:

通常您希望将对象放在堆栈上。也就是说,“堆栈对象映射”应该这样做(我假设您的意思是“不是指针映射” - 因为很可能,映射中的每个元素无论如何都会被动态分配)。

只有在以下情况下,您才应该保留指针映射:

  • 您只能使用映射访问代码中的指针,并且您不拥有它们(即您从某个地方收到指针并需要存储它们)

  • 您需要多态行为(即您正在存储指向基类的指针)

在第一种情况下,您应该存储指针。其次,您应该存储智能指针(并让映射中的智能指针管理对象的生命周期)。

【讨论】:

  • 我在项目中使用 smart_pointers 时遇到了问题。由于地图存储 smart_pointers 还负责将这些对象发送到其他一些模块,这些模块又将它们存储在向量中(比如说)。通过这种方式,我删除的对象从未真正从内存中删除,因为引用计数从未达到零。
  • 同意你的第二点......但在这种情况下,你也应该注意完全拥有这些对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2021-08-30
  • 2021-10-11
  • 2011-09-26
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多