動的リストにデータを保存したいarduinoプログラムがあります。このために私は以下を使用しますstruct
:
struct Project {
boolean status;
String name;
struct Project* nextProject;
};
Project
ここで、外部データに応じて、動的な量のオブジェクトを生成します。私は最初のProject
オブジェクトのみを変数として持っており、残りはnextProject
ポインターを介して取得できます。
Project
オブジェクトの生成は、loop
毎分私の中で行われます。問題は、時々、それが空になるまで記憶を失うことです。
これは私のメインループがどのように見えるかです:
void loop() {
webServer(server);
webClient();
if (parseTimer(60)) {
sendRequest();
}
}
(60秒ごとparseTimer
に戻るノンブロッキング遅延関数です。オブジェクトを生成します)true
sendRequest
Project
メモリを測定する私の方法:
uint8_t* stackptr;
uint8_t* heapptr;
long getFreeMemory() {
stackptr = (uint8_t *) malloc(4);
heapptr = stackptr;
free(stackptr);
stackptr = (uint8_t *) (SP);
return long(stackptr) - long(heapptr);
}
これは、各ループのメモリ量です。
1: 4716 *
2: 4716 *
3: 4716 *
4: 4671
5: 4687
6: 4587 *
7: 4736
8: 4587 *
9: 4559
10: 4577
11: 4515
12: 4527
13: 4587 *
14: 4479
15: 4497
16: 4435
17: 4447
18: 4587 *
19: 4399
20: 4417
21: 4355
22: 4367
23: 4587 *
24: 4319
メモリは少なくなっていますが、最初の数ループの後、5番目のループごと4587 Bytes
に空きメモリがあります。〜280ループの後、プログラムはメモリ不足になりますが、それまでは5番目のループごとに正確に4587 Bytes
空きメモリがあります。この奇妙な動作の原因となる可能性があるものと、メモリリークのないより優れた動的リストを作成する方法を誰かに説明してもらえますか?
アップデート
各ループで、Project
オブジェクトが生成、使用、および削除されます。それはsthを行います。このような:
void sendRequest() {
// at first it gets some remote data from a server the result is:
String names[] = {"Project 1", "Project 2", "Project 3"};
boolean states[] = {true, false, true};
for(int i = 0; i <= projectCount; i++) {
addProject(names[i], states[i]);
}
}
// all variables that are not declarated here are declarated in the
// header file of the class
void addProject(String name, boolean state) {
if (!startProject) {
startProject = true;
firstProject.status = state;
firstProject.name = name;
firstProject.nextProject = NULL;
ptrToLastProject = &firstProject;
} else {
ptrToLastProject->nextProject = new Project();
ptrToLastProject->nextProject->status = tempProjectStatus;
ptrToLastProject->nextProject->name = tempData;
ptrToLastProject->nextProject->nextProject = NULL;
ptrToLastProject = ptrToLastProject->nextProject;
}
}
void RssParser::resetParser() {
delete ptrToLastProject;
[...]
}