c++ - 相同的结构可以在 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]
我怎样才能解决这个问题?
解决方案
我终于找到了答案。
在某些情况下,数据被插入到我程序的 curpattern->chained_fail_log[-1] 中。
我修复了这些情况,然后内存释放(删除)可以正常工作。
推荐阅读
- rabbitmq - 如何在本地 pcfdev 上安装 p-rabbitmq 服务?
- mysql - 使用数据库 mysql 在 django 中添加产品功能的最佳方法是什么
- javascript - 通过我的服务器将多个文件上传到 S3 时,如何从故障中恢复?
- c++ - 虚幻引擎:如何在我的 character.cpp 中获取 FollowCamera
- python - 用 Python 编写和用 C 编写的文件大小不同
- java - 如何在 swagger 的 API 组描述 UI 中添加调用 API 的链接
- swiftui - 带有 SegmentPickerStyle() 的选取器在 SwiftUI 中不显示选取器标题
- javascript - 你可以在不使用它的情况下改变工厂函数的属性吗?
- java - 使用 JAVA 连接到 JIRA
- java - 在 R 中使用 h2o.init() 时出错 - Java 相关