【发布时间】:2015-04-08 10:06:30
【问题描述】:
我的嵌入式 Linux 系统有 28K RAM 和 31.6M 的闪存,文件系统安装在上面。我开发了一个需要在嵌入式 Linux 中连续运行的应用程序。问题是应用程序的虚拟存储大小(top 命令中的 VSZ)不断增加,直到系统崩溃。如果我理解正确并纠正我如果我错了,VSZ 应该根据程序完成的内存分配而变化,如果内存被释放,它应该回到之前的值并保持不变。
程序在源代码中使用如下声明:
1- 结构指针向量:
vector<Struct*> someVector; // Struct pointers are initialized with new
// After the previous vector has some values, it is freed like this
for(unsigned i = 0; i < someVector.size(); i++)
{
delete someVector[i];
}
someVector.clear();
vector<Struct*>().swap(someVector);
2- 字符串向量,与之前相同,但不是循环内的delete:someVector[i] = "";
3-char*
char* somePointer = (char*) malloc(100);
free(somePointer);
somePointer = NULL;
4- 有时我使用 fstream* 初始化 new 我认为这不会有任何区别,因为 C++ 对象一旦超出范围就会被销毁。
5- char** array = new char*[100]; 被delete[] array 删除。我在内部元素上使用了delete,但valgrind 给了我Mismatched free/delete 或类似的东西。
注意:来源很大,这些是应用程序使用最多的数据结构。如果还有什么可疑的地方我会更新的
我编译应用程序并使用 SSH 将其移动到嵌入式设备,我运行应用程序并监控 top 命令输出;应用程序进程的VSZ值不断增加,直到11K这样的大值,系统崩溃。我很确定我所做的每一次分配都有相应的免费机制(free, delete 等)。
valgrind ./myApplication 工具甚至没有显示警告消息,我应该假设分配和释放是安全完成的吗?
感谢任何帮助。我可以立即获取所需的任何信息。提前致谢!
2015 年 8 月 4 日更新:增加应用程序 VSZ 的过程是收集数据并将它们连续存储在闪存上的文件中,有一种机制可以检查是否超出大小,但我现在不使用它。这有关系吗?
【问题讨论】:
-
您的意思可能是 28M RAM,而不是 28K?
-
“有时我使用
fstream*初始化new我认为这不会有任何区别,因为 C++ 对象一旦超出范围就会被销毁。” - 除非你明确地调用delete,或者使用智能指针。 “我在内部元素上使用了 delete 但 valgrind...” - 如果它们被分配了new char[],你确实应该使用delete[]:你确定你只是删除数组的子集你填充的元素呢?你最好使用vector<std::string>,通常情况下会自行释放。不需要2个someVector[i] = ""; -
@amdn 也可能是 28Kb。毕竟是嵌入式系统。我正在使用具有 192Kb RAM 的系统,并且永久占用了 32Kb。我的朋友说无论如何这个处理器已经足够了,所以我觉得完全有可能。
-
@luk32,可能是,但后来 OP 说 VSZ 一直在增加,直到像 11K 这样的大值 - 即使对于嵌入式来说也似乎很小。
-
valgrind不抱怨#2 吗?这显然是内存泄漏,除非向量 elemenst 先前指向的字符串是静态的。对于#5,您应该使用delete[]删除内部元素,而不是delete
标签: c++ c memory-management