【发布时间】:2015-12-15 08:03:49
【问题描述】:
我有以下循环,它从这里的实现中弹出我拥有的 C++ 并发队列。 https://juanchopanzacpp.wordpress.com/2013/02/26/concurrent-queue-c11/
while (!interrupted)
{
pxData data = queue->pop();
if (data.value == -1)
{
break; // exit loop on terminating condition
}
usleep(7000); // stub to simulate processing
}
我正在使用 CentOS7 中的系统监视器查看内存历史记录。 从队列中读取值后,我正在尝试释放队列占用的内存。但是,随着以下 while 循环的运行,我没有看到内存使用量下降。我已经验证队列长度确实下降了。
但是,当遇到 -1 并且循环退出时,它确实会失败。 (程序还在运行)但是我不能有这个,因为usleep在哪里,我想做一些密集的处理。
问题:为什么数据占用的内存没有被释放? (根据系统监视器)当变量超出范围时,堆栈分配的内存不应该被释放吗?
结构体定义如下,并在程序开始时填充。
typedef struct pxData
{
float value; // -1 value terminates the loop
float x, y, z;
std::complex<float> valueData[65536];
} pxData;
它填充了 ~10000 pxData,大致转换为 5GB。系统只有~8GB。 因此,释放内存以在系统中进行其他处理非常重要。
【问题讨论】:
-
什么时候超出范围?
usleep仍在作用域中运行。 -
我看不出有任何理由用
C标记这个 -
什么是
pop.value? -
我的意思是 while 循环的下一次迭代,在 usleep 完成之后。 pop.value 是一个浮点数。
-
对不起...我正在打字看着另一个屏幕..没有互联网访问。
标签: c++ memory memory-management