通过更改typedef的结构体,可以使用此简单代码测试两种场景。在分配和删除这些结构体之后,将分配1GB的1MB char缓冲区,以查看char缓冲区是否使用了这些结构体曾经占用的内存。
struct HalfMegStruct
{
HalfMegStruct():m_Next(0){}
/* return the number of objects needed to allocate one gig */
static int getIterations(){ return 2048; }
int m_Data[131071];
HalfMegStruct* m_Next;
};
struct QuarterMegStruct
{
QuarterMegStruct():m_Next(0){}
/* return the number of objects needed to allocate one gig */
static int getIterations(){ return 4096; }
int m_Data[65535];
QuarterMegStruct* m_Next;
};
// which struct to use
typedef QuarterMegStruct UseType;
int main()
{
UseType* first = new UseType;
UseType* current = first;
for ( int i = 0; i < UseType::getIterations(); ++i )
current = current->m_Next = new UseType;
while ( first->m_Next )
{
UseType* temp = first->m_Next;
delete first;
first = temp;
}
delete first;
for ( unsigned int i = 0; i < 1024; ++i )
// one meg buffer, i'm aware this is a leak but its for illustrative purposes.
new char[ 1048576 ];
return 0;
}
以下是我使用 Address Space Monitor 的结果。请注意,这两个最终结果之间唯一的区别是分配给 1 GB 标记的结构体的大小不同。 对我来说,这似乎是一个相当严重的问题,也许很多人可能正在遭受此类问题而并不知情。
- 这是设计上的问题还是应该被视为错误?
- 我能否使小型删除的对象实际上可以由更大的分配使用?
- 更好奇的是,Mac 或 Linux 机器是否会遇到相同的问题?