【发布时间】:2011-09-18 00:16:07
【问题描述】:
目前,我的所有对象都管理自己的内存,通常在其构造函数中使用new 进行分配,并在其析构函数中使用delete。这目前有效,但我拥有的使用任意数量内存的类数量正在增长。 new 本质上是一个“请求”这一事实也让我感到困扰,因为这些对象中没有代码来处理被告知“不”的情况,如果我不需要,我不想依赖异常处理。
在性能方面是否有益于完全 将所有分配内存的调用屏蔽到一个处理 堆上的每个内存分配,可能分配大块 一次并使用placement new来处理参考?
在较小的类中使用内存分配是否是一个足够大的问题,甚至会为此烦恼?
我还能使用 STL 容器并强制它们使用我的堆吗 提供?
提前谢谢你!
【问题讨论】:
-
“这些对象中没有代码来处理被告知“不”,如果我不需要,我不想依赖异常处理”-你还想什么其他方式处理这个?您要么有支票,要么有例外。内存不是无限的,所以没有其他选择。
-
@merlyn - 如果我将它集中到一个类中,检查将根据请求在内存管理类中进行。然后我只需要在那里放置所有需要的代码。例如,我可以提示用户释放内存,或者在程序尝试再次分配内存时暂停程序。或者只是在那个时候终止。
-
您仍然拥有所有这些异常处理选项,并且您可以将代码放在它所属的位置 - 了解系统中正在发生的事情的更高级别的代码(因此可以进行释放然后重试操作,或向用户显示消息)。当然你可以争辩说你的分配器应该有一个“检查是否有足够空间”的方法,所以你可以在抛出异常之前做到这一点......
-
“例如,我可以提示用户释放内存,或者在程序尝试再次分配内存时停止程序。或者直接终止”——这就是
std::set_new_handler的用途。另请注意,在内存不足的情况下很难向用户显示消息,您必须确保提前分配了所有必要的资源。 -
@Steve - 我不知道它存在。那是...正是我一直在寻找的,谢谢! (我想为了显示一条消息,在一开始就保留内存以供关键使用会有所帮助)
标签: c++ memory-management stl