相同的结构可以在C++中分配不同的内存大小吗?

Can the same structures allocate different memory sizes in C++?

本文关键字:内存 分配 C++ 结构      更新时间:2023-10-16

我的结构代码是这样的:

typedef struct Patterns {
int pattern_num;
char *chained_fail_log;
Patterns *next_pattern;
} Pat;

我为链表做了这个结构,链表由"新"分配

for( int num_of_pat = 1; num_of_pat < number_of_pattern+1; num_of_pat++) {
curpattern->next_pattern = new Pat;
curpattern = curpattern->next_pattern;
curpattern->next_pattern = NULL;
curpattern->pattern_num = num_of_pat;
curpattern->chained_fail_log =  new char[chain_cell_length+1];
for(int i = 0; i < chain_cell_length; i++ ) curpattern->chained_fail_log[i] = '0';
curpattern->chained_fail_log[chain_cell_length] = '';
}
curpattern->next_pattern = NULL;

我通过删除删除了结构。

`void Circuit_Fail_Log::freepattern() {
Pat * delpattern = fail_pattern_log;
int i = 0;
while( delpattern != NULL ) {
i++;
fail_pattern_log = delpattern->next_pattern;
printf("pattern_num:%dtchained_pattern:%sn",delpattern->pattern_num,delpattern->chained_fail_log);
delete[] delpattern->chained_fail_log;
delpattern->chained_fail_log = NULL;
delete delpattern;
delpattern = fail_pattern_log;
}

正如您在代码中看到的,在某些情况下,指向下一个列表的指针不能指向下一个列表。 我假设列表的内存大小大于分配时的大小。 因此,链表指针不能指向下一个列表。

错误消息是

*** Error in `fextraction': double free or corruption (out):0x0000000001de9de0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x81679)[0x7f66390fb679]
fextraction[0x401ae4]
fextraction[0x401ed3]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f663909c505]
fextraction[0x4008d9]

我该如何解决这个问题?

它不应该发生,但实际上您是通过写入不记录到chained_fail_log的内存地址来做到这一点的。 如果chained_fail_log应该有chain_cell_length个字符长度减去空终止符,那么你应该:

// one more for null terminator
curpattern->chained_fail_log =  new char[chain_cell_length+1]; 
for(int i = 0; i < chain_cell_length; i++ ) curpattern->chained_fail_log[i] = '0';
curpattern->chained_fail_log[chain_cell_length] = ''

在您的原始代码中,curpattern->chained_fail_log[chain_cell_length] = ''正在破坏chained_fail_log的内存边界

我终于找到了答案。

在某些情况下,数据入到我的程序的curpattern->chained_fail_log[-1]中。

我修复了这些情况,然后内存释放(删除(可以正常工作。