【发布时间】:2014-08-20 05:48:17
【问题描述】:
所以我今晚有一个奇怪的经历。
我正在使用 C++ 编写一个程序,该程序需要某种方式从文件中读取一长串简单数据对象并将它们存储在主内存中,大约 400,000 个条目。对象本身类似于:
class Entry
{
public:
Entry(int x, int y, int type);
Entry(); ~Entry();
// some other basic functions
private:
int m_X, m_Y;
int m_Type;
};
很简单,对吧?好吧,因为我需要从文件中读取它们,所以我有一些循环,比如
Entry** globalEntries;
globalEntries = new Entry*[totalEntries];
entries = new Entry[totalEntries];// totalEntries read from file, about 400,000
for (int i=0;i<totalEntries;i++)
{
globalEntries[i] = new Entry(.......);
}
当我在任务管理器上跟踪该程序时,该程序增加了大约 25 到 35 兆字节。堆栈分配的简单更改:
Entry* globalEntries;
globalEntries = new Entry[totalEntries];
for (int i=0;i<totalEntries;i++)
{
globalEntries[i] = Entry(.......);
}
突然间它只需要 3 兆字节。为什么会这样?我知道指针对象对它们有一点额外的开销(指针地址为 4 个字节),但这不足以产生很大的不同。可能是因为程序分配内存效率低下,最终在分配的内存之间出现了大块未分配的内存?
【问题讨论】:
-
它看起来您正在泄漏
entries,并且您可能正在泄漏其他所有内容,但没有足够的代码可以确定。 -
这不是泄漏。我进入调试器以确保分配内存的代码块不会被多次调用。每个条目仅在循环中按顺序分配一次。我有所有条目的可视化表示。
-
这并不意味着您没有泄漏。如果你分配了东西但你不删除它,你就有泄漏。请注意,您似乎甚至没有使用可能泄漏的东西。
-
在运行开始时调用一次分配内存,然后在整个程序中不断使用这些条目。
-
您的代码没有显示。它显示您使用
new或new [](其中一些您不使用)分配东西,并且从不调用delete或delete []。
标签: c++ memory-management heap-memory stack-memory