乐鑫技术交流
直播中

王萍

7年用户 1337经验值
私信 关注
[问答]

ESP8266使用Lambda赋值创建崩溃的原因?


#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)

刘娟

2024-7-18 17:59:33
在这段代码中,你试图使用Lambda表达式为ESP8266分配内存并赋值。然而,代码中存在一些问题,这可能导致崩溃。让我们逐步分析并找出问题所在。

1. 首先,你的代码包含了一些不完整的部分,例如`#include`和`typedef`。确保你包含了所需的头文件,例如`#include `和`#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 reqHandler;

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表达式,并在最后释放了分配的内存。这应该可以避免崩溃的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分