完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include typedef std::function reqHandler; reqHandler *l; void setup() { Serial.begin(115200); Serial.printf("启动 realloc lambda 测试...n"); l=(reqHandler *) malloc(2*sizeof(reqHandler)); // set 0 Serial.printf("start assign 0 in set 0 l=%0xn",l); l[0]=[](){ Serial.printf("lambda 0n"); }; l[1]=[](){ Serial.printf("lambda 1n"); }; l=(reqHandler *) realloc(l,4*sizeof(reqHandler)); // set 1 Serial.printf("start assign 2 in set 1 l=%0xn",l); l[2]=[](){ Serial.printf("lambda 2n"); }; l[3]=[](){ Serial.printf("lambda 3n"); }; l=(reqHandler *) realloc(l,6*sizeof(reqHandler)); // set 2 Serial.printf("start assign 4 in set 2 l=%0xn",l); l[4]=[](){ Serial.printf("lambda 4n"); }; // creates a crash l[5]=[](){ Serial.printf("lambda 5n"); }; Serial.printf("... End realloc lambda test.n"); } void loop() { } ...创建以下输出: 启动 realloc lambda 测试... 开始在集合 0 中分配 0 l=3fff086c 开始在集合 1 中分配 2 l=3fff08a4 在集合 2 中开始分配 4 l=3fff08a4 ets Jan 8 2013,rst cause:4, boot mode:(1,6) WDT 复位 It seems, the realloc function is not working correct. The "cause: 4" (=Level1InterruptCause) seems to make no sense at the point of the code which creates the crash. 我正在使用 ardunio IDE 1.6.8 和 ESP8266 插件https://github.com/esp8266/Arduino/rele ... -2.3.0.zip.我的硬件是普通的 ESP-01。 IDE参数: 板卡:通用ESP8266模块 闪光模式:QIO 闪光频率:40MHz CPU频率:80MHz 闪光灯大小:1M (192k SPIFFS) |
|
相关推荐
1个回答
|
|
在这段代码中,你试图使用Lambda表达式为ESP8266分配内存并赋值。然而,代码中存在一些问题,这可能导致崩溃。让我们逐步分析并找出问题所在。
1. 首先,你的代码包含了一些不完整的部分,例如`#include`和`typedef`。确保你包含了所需的头文件,例如`#include 2. 你使用了`reqHandler *l;`来声明一个指针,指向`std::function`类型的对象。这是一个正确的声明。 3. 在`setup()`函数中,你尝试使用`malloc`为`reqHandler`分配内存。然而,`malloc`是C语言的内存分配函数,而不是C++。在C++中,你应该使用`new`来分配内存。此外,你需要为分配的内存提供正确的大小。在这种情况下,你需要为每个`reqHandler`分配足够的内存。 4. 你试图使用Lambda表达式为`l[0]`和`l[1]`赋值。但是,你使用了错误的语法。在C++中,Lambda表达式应该放在`[]`中,并且需要提供函数签名。 5. 你的代码中有一些不完整的部分,例如`l[1]=[]`。这可能导致编译错误。 为了解决这些问题,你可以尝试以下修改后的代码: ```cpp #include #include typedef std::function void setup() { Serial.begin(115200); Serial.printf("启动 realloc lambda 测试...n"); reqHandler *l = new reqHandler[2]; // 使用new分配内存 // 设置l[0] Serial.printf("start assign 0 in set 0 l=%pn", l); l[0] = []() { Serial.printf("lambda 0n"); }; // 设置l[1] l[1] = []() { Serial.printf("lambda 1n"); }; // 调用Lambda表达式 l[0](); l[1](); // 释放内存 delete[] l; } void loop() { // 这里可以放置你的循环代码 } ``` 这段代码使用了`new`来分配内存,并正确地为每个`reqHandler`设置了Lambda表达式。同时,它还调用了这些Lambda表达式,并在最后释放了分配的内存。这应该可以避免崩溃的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
1149 浏览 1 评论
582浏览 6评论
480浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
465浏览 5评论
466浏览 4评论
441浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 04:12 , Processed in 0.952917 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号