我有一个 arduino 程序,我想将数据存储在动态列表中。为此,我使用以下内容struct
:
struct Project {
boolean status;
String name;
struct Project* nextProject;
};
Project
现在我根据外部数据生成动态数量的对象。我只有第一个Project
对象作为变量,其余的我可以通过nextProject
指针获得。
对象的生成每分钟Project
都在 my 中完成。loop
问题是我有时会失去记忆,直到它变空。
这就是我的主循环的样子:
void loop() {
webServer(server);
webClient();
if (parseTimer(60)) {
sendRequest();
}
}
(parseTimer
是一个非阻塞延迟函数,true
每 60 秒返回一次;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
生成、使用和删除对象。它做某事。像这样:
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;
[...]
}