首页 > 解决方案 > 相同的结构可以在 C++ 中分配不同的内存大小吗?

问题描述

我的结构代码是这样的:

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] = '\0';
}
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:%d\tchained_pattern:%s\n",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]

我怎样才能解决这个问题?

标签: c++linked-listdynamic-memory-allocation

解决方案


我终于找到了答案。

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

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


推荐阅读