完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我为结构数组分配内存,这是我的代码:
size_t taskAmount; object *tasks = Parsejson(subbuff,sizeof(subbuff),&taskAmount); os_free(tasks); 没有该代码,我的应用程序可以正常工作,但是如果我使用它,一段时间后我的应用程序会崩溃,并且我会在串行终端上写入以下文本: 致命异常 9 (LoadStoreAlignmentCause): 我认为这个错误可能与可用内存太少有关?这就是我如何在Parsejson功能: 对象 *retObj = (对象*)os_zalloc(sizeof(对象) * 10); 如何解决此错误? 编辑:如果我删除这行代码: code os_free(tasks) 我的代码工作了 ~30 分钟。 但是 esp8266 不会再次连接到网络,例如,这是我的user_dns_found函数(由user_dns_check回调): LOCAL void ICACHE_FLASH_ATTR user_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) { struct espconn *pespconn = (struct espconn *)arg; if (ipaddr == NULL) { os_printf("user_dns_found NULL rn"); return; } //dns got ip os_printf("user_dns_found %d.%d.%d.%d rn", *((uint8 *)&ipaddr->addr), *((uint8 *)&ipaddr->addr + 1), *((uint8 *)&ipaddr->addr + 2), *((uint8 *)&ipaddr->addr + 3)); if (tcp_server_ip.addr == 0 && ipaddr->addr != 0) { // dns succeed, create tcp connection tcp_server_ip.addr = ipaddr->addr; os_memcpy(pespconn->proto.tcp->remote_ip, &ipaddr->addr, 4); // remote ip of tcp server which get by dns pespconn->proto.tcp->remote_port = 80; // remote port of tcp server pespconn->proto.tcp->local_port = espconn_port(); //local port of ESP8266 espconn_regist_connectcb(pespconn, user_tcp_connect_cb); // register connect callback espconn_regist_reconcb(pespconn, user_tcp_recon_cb); // register reconnect callback as error handler espconn_connect(pespconn); // tcp connect } } |
|
相关推荐
1个回答
|
|
要正确释放分配的内存,您需要确保在释放内存之前正确地分配了内存。在您的代码中,您使用了 `os_free()` 函数来释放内存,但是这个函数并不是 ESP8266 的标准函数。在 ESP8266 中,通常使用 `free()` 函数来释放内存。以下是一些建议,以确保您的代码正确地释放内存并避免内存泄漏:
1. 使用 `malloc()` 而不是 `os_malloc()` 来分配内存。`os_malloc()` 是一个操作系统特定的函数,可能在 ESP8266 上不适用。 ```c size_t taskAmount; object *tasks = (object *)malloc(sizeof(object) * taskAmount); ``` 2. 在分配内存后,确保正确地初始化数组。这可以通过循环或使用 `memset()` 函数来实现。 ```c memset(tasks, 0, sizeof(object) * taskAmount); ``` 3. 使用 `free()` 函数来释放内存,而不是 `os_free()`。 ```c free(tasks); ``` 4. 在释放内存之前,确保您的代码没有尝试访问已释放的内存。这可能导致程序崩溃。 5. 确保您的 `Parsejson()` 函数正确地处理内存分配和释放。如果该函数内部有错误,可能会导致内存泄漏或程序崩溃。 6. 考虑使用动态内存管理库,如 `newlib-nano`,它提供了更完整的内存管理功能,包括内存分配、释放和错误处理。 7. 如果您的程序仍然崩溃,可以尝试使用调试工具,如 `gdb` 或 `esptool.py`,来查找内存泄漏或访问违规的确切位置。 8. 确保您的 ESP8266 固件是最新的,因为旧版本的固件可能存在内存管理问题。 通过遵循这些建议,您应该能够更有效地管理 ESP8266 上的内存,并避免程序崩溃。 |
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:27 , Processed in 0.783693 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号