Answers
在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, 1 month ago