下列两种情况哪个占用的空间更大


(1)new一个10个整型的数组

(2)分10次new一个整型的变量

希望能够具体介绍一下~

数据结构 C++ 算法

你好我叫大表哥 12 years ago

在debug版本下,第二种情况占用的空间更大 ,因为动态申请的空间是new在堆上的,通过一个链表来管理的。链表中的每个节点的结构如下

   
  typedef struct _CrtMemBlockHeader
  
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;

这个推荐你去看我回答的一个帖子, 这里 ,里面详细的介绍了new的这个过程。
在release版本下,我认为是一样大的 ,单纯就new占用的空间说的话,因为在release下是没有维护那个链表的,为了证明这个说法,我做了个实验
这个图就是在debug下运行的时候崩溃的错误信息,可以看到断言——BLOCK_TYPE_ISVALID就是delete函数里面,在检查链表信息的时候发现这块内存空间没有new在栈上的错误信息
请输入图片描述
Release下的错误信息,虽然release本来就弹不出断言,但是从错误信息也可以看出,这个并没有链表去维护申请的内存区域

请输入图片描述
release下面的这种情况是我个人的看法,有错还请大家指正

上面的这个实验说明,在debug下,这个链表结构是存在的,在release下,这个链表是不存在的。
但是这只是说占用堆上的空间的大小。因为第二种情况下,如果分开10次new的话,符号表中的内容也会比第一种的情况要多。但是在堆上占用的空间还是一样大的

镜花水月丶 answered 12 years ago

Your Answer