我的结构代码是这样的:
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]中。
我修复了这些情况,然后内存释放(删除(可以正常工作。