相关疑难解决方法(0)

巨大的std :: vector <std :: vector>在销毁时不会释放所有内存

当使用非常大的向量向量时,我们发现没有释放部分内存.

#include <iostream>
#include <vector>
#include <unistd.h>

void foo()
{
    std::vector<std::vector<unsigned int> > voxelToPixel;
    unsigned int numElem = 1<<27;
    voxelToPixel.resize( numElem );

    for (unsigned int idx=0; idx < numElem; idx++)
        voxelToPixel.at(idx).push_back(idx);

}

int main()
{
    foo();
    std::cout << "End" << std::endl;
    sleep(30);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将留下大约4GB的内存,直到进程结束.

如果我们将for行更改为

for (unsigned int idx=0; idx < numElem; idx++)
    voxelToPixel.at(0).push_back(idx);
Run Code Online (Sandbox Code Playgroud)

记忆被释放了.

使用gcc-4.8Linux机器上.我们习惯于htop在具有100 GB RAM的计算机上跟踪内存使用情况.您将需要大约8 GB的RAM来运行代码.你能重现这个问题吗?关于为什么会发生这种情况的任何想法?

编辑:我们已经看到,这不会发生在Mac(任何一个gccclang).此外,在linux中,如果我们调用foo两次(但第三次再次发生),则释放内存.

c++ memory vector

22
推荐指数
1
解决办法
1123
查看次数

如何释放在WebAssembly中公开的Rust代码分配的内存?

我有一个用Rust和wasm-bindgen编写的Web应用程序需要存储状态.状态存储如下:

lazy_static! {
    static ref ID_TO_DATA: Mutex<HashMap<u32, Data>> = Mutex::new(HashMap::new());
}

pub struct Data {
    pub coder_id: u16,
    pub bools: Vec<bool>,
    pub ints: Vec<i32>,
    pub strings: Vec<String>,
}
Run Code Online (Sandbox Code Playgroud)

我尝试以下方法删除数据并释放内存,并从中删除数据,HashMap并且不会报告错误:

#[wasm_bindgen]
pub fn remove_data(id: u32) {
    match ID_TO_DATA.lock().unwrap().remove(&id) {
        Some(data) => {
            std::mem::drop(data);
        }
        None => {}
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,浏览器选项卡使用的内存不会丢失(使用Chrome 67).我使用Windows的任务管理器,并观察相关进程/选项卡的内存增长到近2GB,然后在我的程序删除所有条目后,我等了一会儿,内存仍然接近2GB.

我也试过以下,但得到了这个错误: RuntimeError: memory access out of bounds

#[wasm_bindgen]
pub fn remove_data(id: u32) {
    match ID_TO_DATA.lock().unwrap().remove(&id) {
        Some(mut data) => {
            unsafe {
                std::ptr::drop_in_place(&mut data);
            }
        }
        None => …
Run Code Online (Sandbox Code Playgroud)

rust webassembly

14
推荐指数
1
解决办法
600
查看次数

使用std :: vector与std :: list时,Linux内存使用率排在首位

我注意到Linux中有关内存使用情况(RES)的一些有趣行为top.我附加了以下程序,它在堆上分配了几百万个对象,每个对象都有一个大约1千字节的缓冲区.指向这些对象的指针由a std::list或a 跟踪std::vector.我注意到的有趣行为是,如果我使用a std::list,则报告的内存使用率top在睡眠期间永远不会改变.但是,如果我使用std::vector,那些睡眠期间内存使用率将降至接近0.

我的测试配置是:
Fedora Core 16
内核3.6.7-4
g ++版本4.6.3

我已经知道的:
1.std :: vector将根据需要重新分配(加倍大小).
2. std :: list(我相信)一次分配它的元素1.
std :: vector和std :: list默认使用std :: allocator来获取它们的实际内存
4.程序没有泄漏; valgrind宣称不可能泄漏.

令我困惑的是:
1.std :: vector和std :: list都使用std :: allocator.即使std :: vector正在进行批量重新分配,std :: allocator也不会以几乎相同的方式将内存分发给std :: list和std :: vector?毕竟这个程序是单线程的.
2.我在哪里可以了解Linux内存分配的行为.我听说过关于Linux保持RAM分配给进程的声明,即使它释放了它,但我不知道这种行为是否得到保证.为什么使用std :: vector会对这种行为产生如此大的影响?

非常感谢您阅读本文; 我知道这是一个相当模糊的问题.我在这里寻找的'答案'是这个行为是'定义'还是我可以找到它的文档.

#include <string.h>
#include <unistd.h>
#include <iostream>
#include <vector>
#include <list>
#include <iostream>
#include <memory>

class Foo{
public:
    Foo()
    {
        data = …
Run Code Online (Sandbox Code Playgroud)

c++ linux memory heap allocator

6
推荐指数
1
解决办法
1511
查看次数

如何强制清除STL内存缓存?

我有一个有类型字段的类unordered_map.我在我的应用程序中创建了这个对象的单个实例,它包含在一个shared_ptr.该对象非常耗费内存,我想在使用它后立即将其删除.但是,重置指针只会释放对象占用的一小部分内存.如何强制程序释放对象占用的所有内存?

以下模拟程序重现我的问题.for循环打印垃圾只是给我足够的时间来观察使用的内存top.析构函数刚刚被调用reset().此外,紧接着,使用的内存从大约2 GB下降到1.5 GB.

#include <iostream>
#include <memory>
#include <unordered_map>

using namespace std;

struct A {
  ~A() {
    cerr << "Destructor" << endl;
  }

  unordered_map<int, int> index;
};

int main() {
  shared_ptr<A> a = make_shared<A>();
  for (size_t i = 0; i < 50000000; ++i) {
    a->index[2*i] = i + 3;
  }

  // Do some random work.
  for (size_t i = 0; i < 3000000; ++i) {
    cout << "First" << endl;
  } …
Run Code Online (Sandbox Code Playgroud)

c++ stl g++ c++11

6
推荐指数
1
解决办法
2443
查看次数

在程序退出之前,Std :: deque不会释放内存

在linux上,std :: deque在程序退出之前不会释放内存.完整的代码如下.任何帮助将不胜感激!

#include <deque>
#include <vector>
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <queue>
#include <list>
#include <cstdio>
#include <cstdlib>

typedef  boost::shared_ptr<std::vector<int> > VecPtr;
typedef  std::deque< VecPtr  > QueueType;

 char buf[1024];
 char line[1024];

 int main()
 {

  {

    int v=0;
    QueueType  deq;
    for(int i=0; i<30;++i)
    for(int j=0; j<1000;++j)
    for(int k=0;k<1000;++k)
    {
       VecPtr p( new std::vector<int>);
       deq.push_back(p);
    }

    std::cout<<"Done with increasing deq:deq size="<<deq.size()<<std::endl;
    sleep(20);

    std::cout<<"start decreasing deq size"<<std::endl;
    while(deq.size()>0)
    {
      deq.pop_front();
    }
    std::cout<<"done with decreasing deq size,deq size="<<deq.size()<<std::endl;
  }
  std::cin.getline(line,sizeof(line));
  return …
Run Code Online (Sandbox Code Playgroud)

c++ stl deque

5
推荐指数
1
解决办法
3773
查看次数

标签 统计

c++ ×4

memory ×2

stl ×2

allocator ×1

c++11 ×1

deque ×1

g++ ×1

heap ×1

linux ×1

rust ×1

vector ×1

webassembly ×1