gpt4 book ai didi

c++ - 带有指向自身指针的 Arduino 结构泄漏内存

转载 作者:太空宇宙 更新时间:2023-11-04 12:06:02 36 4
gpt4 key购买 nike

我有一个 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();
}
}

(parseTimer 是一个非阻塞延迟函数,每 60 秒返回一次 truesendRequest 生成 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 字节 的可用内存。 ~280 次循环后程序内存不足,但直到那里每 5 次循环都有正好 4587 字节 空闲内存。任何人都可以向我解释这种奇怪行为的原因是什么,以及我如何创建一个不会泄漏内存的更好的动态列表。

更新

在每个循环中,生成、使用和删除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;
[...]
}

最佳答案

首先,您没有泄漏内存,因为每 5 次迭代您的内存就会恢复到 4587 字节

然而,这里出现了一个有趣的模式。您会注意到对 getFreeMemory 的每一个调用集 您有4587 字节 之前发生的情况总是比最后一组少80 字节

我将猜测每个sendRequest 上接收到的数据越来越多。 ,作为返回,您尝试在每次循环中分配更多内存。您在某处发布它很好,但在某些时候您试图分配太多!

一种可能是您附加请求数据,而不是覆盖它,随后是projectCount不断增加。

作为旁注,请注意这个:

for(int i = 0; i <= projectCount; i++) {
addProject(names[i], states[i]);
}

遍历数组需要一个基于 0 的索引。当你检查条件 i <= projectCount您可能超出了缓冲区。如果有3 names 中的元素,还有你的 projectCount3 ,当 i = 3 时会发生什么然后你访问names[i]

关于c++ - 带有指向自身指针的 Arduino 结构泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055600/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com