Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ clear()期间或销毁向量时引发异常3 描述_C++_Vector_Arduino_Esp8266_Arduino Esp8266 - Fatal编程技术网

C++ clear()期间或销毁向量时引发异常3 描述

C++ clear()期间或销毁向量时引发异常3 描述,c++,vector,arduino,esp8266,arduino-esp8266,C++,Vector,Arduino,Esp8266,Arduino Esp8266,有时我在尝试清除std::vector()时会出现异常3 硬件 硬件:ESP-07S ESP8266 Arduino库核心版本:2.4.0-rc1 IDE中的设置 模块:通用ESP8266模块 闪存大小:4MB CPU频率:160Mhz 闪光模式:qio 闪光频率:40Mhz 上传方式:OTA/串行 重置方法:ck 堆栈跟踪 这是来自Arduino异常解码器的stacktrace: Exception 3: LoadStoreError: Processor internal physi

有时我在尝试清除std::vector()时会出现异常3

硬件
  • 硬件:ESP-07S
  • ESP8266 Arduino库核心版本:2.4.0-rc1
IDE中的设置
  • 模块:通用ESP8266模块
  • 闪存大小:4MB
  • CPU频率:160Mhz
  • 闪光模式:qio
  • 闪光频率:40Mhz
  • 上传方式:OTA/串行
  • 重置方法:ck
堆栈跟踪 这是来自Arduino异常解码器的stacktrace:

Exception 3: LoadStoreError: Processor internal physical address or data error during load or store
Decoding 30 results
0x401000b7: umm_disconnect_from_free_list at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266\umm_malloc/umm_malloc.c line 1151
0x4021e9bc: memmove at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libc/string/../../../.././newlib/libc/string/memmove.c line 69 (discriminator 1)
0x40217464: Print::write(unsigned char const*, unsigned int) at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266/Print.cpp line 38
0x4010020c: _umm_free at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266\umm_malloc/umm_malloc.c line 1287
0x4010068c: free at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266\umm_malloc/umm_malloc.c line 1733
0x40215b04: operator delete(void*) at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266/abi.cpp line 57
0x40207940: std::_Vector_base   >::_M_deallocate(double*, unsigned int) at C:\Users\Defozo\Documents\Arduino\jeszcze nowsza wersja laser_na_stacje_v2\laser_na_stacje_v2/laser_na_stacje_v2.ino line 565
0x402088ac: std::_Vector_base   >::~_Vector_base() at c:\users\defozo\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/stl_vector.h line 161
0x40209748: std::vector   >::_M_erase_at_end(double*) at c:\users\defozo\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/stl_vector.h line 1353
:  (inlined by) std::vector   >::clear() at c:\users\defozo\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/stl_vector.h line 1126
:  (inlined by) loop at C:\Users\Defozo\Documents\Arduino\jeszcze nowsza wersja laser_na_stacje_v2\laser_na_stacje_v2/laser_na_stacje_v2.ino line 412
0x40217082: std::default_delete ::operator()(TransportTraits*) const at c:\users\defozo\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/unique_ptr.h line 68
0x4010020c: _umm_free at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266\umm_malloc/umm_malloc.c line 1287
0x401020ea: wDev_ProcessFiq at ?? line ?
0x40215d84: loop_wrapper at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266/core_esp8266_main.cpp line 124
0x4010070c: cont_norm at C:\Users\Defozo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0-rc1\cores\esp8266/cont.S line 109
这是重置原因:

Hardware Watchdog
Fatal exception:4 flag:1 (WDT) epc1:0x40000f83 epc2:0x00000000 epc3:0x4000dd3b excvaddr:0x40023c5c depc:0x00000000
代码 我正在初始化这样的向量:

std::vector<double> dhtTempVector, dhtHumidityVector;
std::vector<double> dhtTempMedianVector, dhtHumidityMedianVector;
std::vector<double> bmpTempVector, bmpPressureVector;
std::vector<double> bmpTempMedianVector, bmpPressureMedianVector;
dhtTempVector.reserve(5);
dhtHumidityVector.reserve(5);
bmpTempVector.reserve(5);
bmpPressureVector.reserve(5);
dhtTempMedianVector.reserve(6);
dhtHumidityMedianVector.reserve(6);
bmpPressureMedianVector.reserve(6);
bmpTempMedianVector.reserve(6);
if (!isnan(temp) && !isnan(hum)) {
    dhtTempVector.push_back(temp);
    dhtHumidityVector.push_back(hum);
}
以及:

这是中值函数:

double median(std::vector<double> v)
{
    size_t n = v.size() / 2;
    std::nth_element(v.begin(), v.begin()+n, v.end());
    double vn = v[n];
    if(v.size()%2 == 1) {
        return vn;
    } else  {
        std::nth_element(v.begin(), v.begin()+n-1, v.end());
        return 0.5*(vn+v[n-1]);
    }
}
在这些代码行中:

Serial.print("dhtTempVector size: ");
Serial.println(dhtTempVector.size());
Serial.print("dhtTempMedianVector size: ");
Serial.println(dhtTempMedianVector.size());
Serial.print("dhtHumidityVector size: ");
Serial.println(dhtHumidityVector.size());
Serial.print("dhtHumidityMedianVector size: ");
Serial.println(dhtHumidityMedianVector.size());
for (int k = 0; k < dhtTempVector.size(); ++k) {
    Serial.print(dhtTempVector.at(k));
    Serial.print(" ");
}
Serial.println("--");
for (int k = 0; k < dhtTempMedianVector.size(); ++k) {
    Serial.print(dhtTempMedianVector.at(k));
    Serial.print(" ");
}
Serial.println("--");
for (int k = 0; k < dhtHumidityVector.size(); ++k) {
    Serial.print(dhtHumidityVector.at(k));
    Serial.print(" ");
}
Serial.println("--");
for (int k = 0; k < dhtHumidityMedianVector.size(); ++k) {
    Serial.print(dhtHumidityMedianVector.at(k));
    Serial.print(" ");
}
Serial.println("--");

1287:

1733年:

Print.cpp的特定行:

size_t Print::write(const uint8_t *buffer, size_t size) {
    size_t n = 0;
    while(size--) {
        n += write(*buffer++); //line number 38
    }
    return n;
}
static void loop_wrapper() {
    static bool setup_done = false;
    preloop_update_frequency();
    if(!setup_done) {
        setup();
#ifdef DEBUG_ESP_PORT
        DEBUG_ESP_PORT.setDebugOutput(true);
#endif
        setup_done = true;
    }
    loop();
    run_scheduled_functions(); //line number 124
    esp_schedule();
}

来自core\u esp8266\u main.cpp的特定行:

size_t Print::write(const uint8_t *buffer, size_t size) {
    size_t n = 0;
    while(size--) {
        n += write(*buffer++); //line number 38
    }
    return n;
}
static void loop_wrapper() {
    static bool setup_done = false;
    preloop_update_frequency();
    if(!setup_done) {
        setup();
#ifdef DEBUG_ESP_PORT
        DEBUG_ESP_PORT.setDebugOutput(true);
#endif
        setup_done = true;
    }
    loop();
    run_scheduled_functions(); //line number 124
    esp_schedule();
}
cont.S的第109行:


所有这些似乎都发生在包的一些私有实现中,除了一些标准调用,如“memmove”。您需要查看堆栈转储中提供的行号。或者至少提供它们。我把它们添加到问题中。如果不真正玩这个程序,很难说。我想到了3种可能性(1)在顶部,它看起来像某种初始化顺序,也就是说,它在构造向量之前执行clean()。为什么它“清晰”呢?(2) 另一种可能是内存损坏。我不喜欢1151线。看起来malloc列表已损坏。(3) 对于已经释放的内存,还有一个额外的“空闲”,这可能也解释了1151。这看起来像是堆损坏错误。它可能来自对此的写入,或者另一个数组超出范围。是否可以仅使用
push_back
方法写入向量超出范围的内容?
void umm_free( void *ptr ) {

  ptr = GET_UNPOISONED(ptr);

  /* check poison of each blocks, if poisoning is enabled */
  if (!CHECK_POISON_ALL_BLOCKS()) {
    return;
  }

  /* check full integrity of the heap, if this check is enabled */
  if (!INTEGRITY_CHECK()) {
    return;
  }

  _umm_free( ptr );
} //1733
size_t Print::write(const uint8_t *buffer, size_t size) {
    size_t n = 0;
    while(size--) {
        n += write(*buffer++); //line number 38
    }
    return n;
}
static void loop_wrapper() {
    static bool setup_done = false;
    preloop_update_frequency();
    if(!setup_done) {
        setup();
#ifdef DEBUG_ESP_PORT
        DEBUG_ESP_PORT.setDebugOutput(true);
#endif
        setup_done = true;
    }
    loop();
    run_scheduled_functions(); //line number 124
    esp_schedule();
}