相关疑难解决方法(0)

C++中术语"自由函数"的含义是什么?

在阅读boost :: test的文档时,我遇到了"自由函数"这个术语.我理解的是,自由函数是任何不返回任何函数的函数(它的返回类型为void).但在进一步阅读后,似乎自由函数也没有任何论据.但我不确定.这些都是我的假设.任何人都可以定义自由功能吗?

c++

84
推荐指数
1
解决办法
3万
查看次数

malloc实现是否会将free-ed内存返回给系统?

我有一个长期存在的应用程序,频繁的内存分配 - 释放.任何malloc实现都会将释放的内存返回给系统吗?

在这方面,什么是以下行为:

  • ptmalloc 1,2(默认为glibc)或3
  • dlmalloc
  • tcmalloc(谷歌线程malloc)
  • solaris 10-11默认malloc和mtmalloc
  • FreeBSD 8默认malloc(jemalloc)
  • Hoard malloc?

更新

如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?

如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾.

malloc free mmap glibc tcmalloc

54
推荐指数
4
解决办法
2万
查看次数

C++ delete不释放所有内存(Windows)

我需要帮助了解Windows上的内存分配和释放问题.我正在使用最新更新的VS11编译器(VS2012 IDE)(Update 3 RC).

问题是:我为二维数组动态分配一些内存并立即解除分配.仍然,在内存分配之前,我的进程内存使用量在分配前0.3 MB,在分配时为259,6 MB(预期分配了32768个64位整数阵列(8字节)),分配期间为4106,8 MB,但在释放后内存不会下降到预期的0.3 MB,但仍然停留在12,7 MB.由于我正在释放我已经占用的所有堆内存,我预计内存将回到0.3 MB.

这是我正在使用的C++代码:

#include <iostream>
#define SIZE 32768
int main( int argc, char* argv[] ) {
std::getchar();

int ** p_p_dynamic2d = new int*[SIZE];

for(int i=0; i<SIZE; i++){
    p_p_dynamic2d[i] = new int[SIZE];
}   
std::getchar();

for(int i=0; i<SIZE; i++){
    for(int j=0; j<SIZE; j++){
        p_p_dynamic2d[i][j] = j+i;
    }
}

std::getchar();

for(int i=0; i<SIZE; i++) {
    delete [] p_p_dynamic2d[i];
}
delete [] p_p_dynamic2d;

std::getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks memory-management heap-memory visual-c++

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

强制free()将malloc内存返回给OS

似乎即使我释放了由malloc()分配的Linux进程的所有内存之后,内存仍然为该进程保留,并且没有返回给OS。

默认情况下运行valgrind massif工具不会泄漏。

使用--pages-as-heap = yes运行valgrind会显示以下内容:

-> 13.77%(7,655,424B)0x35FEEEB069:brk(brk.c:31)

-> 13.77%(7,655,424B)0x35FEEEB113:sbrk(sbrk.c:53)

-> 13.77%(7,655,424B)0x35FEE82717:__default_morecore(morecore.c:48)

-> 13.77%(7,655,424B)0x35FEE7DCCB:_int_malloc(malloc.c:2455)

-> 13.77%(7,655,424B)0x35FEE7F4F1:malloc(malloc.c:2862)

因此,即使内存已经由free()释放,似乎malloc调用了brk / sbrk,也没有将其返回给操作系统。

如何强制free()立即调用sbrk()并将所有内存返回给OS?

我在每个MB都非常重要的低端平台上运行。

提前致谢。

c linux memory memory-management glibc

5
推荐指数
2
解决办法
2576
查看次数

什么是 Rust 策略来取消提交并将内存返回给操作系统?

在堆上分配内存是一项昂贵的操作,因此一些编程语言避免将其返还给操作系统,即使已分配的内存不再使用。

但是对于很多场景,比如在云上运行的微服务,你会希望内存使用率低,否则费用会很高。因此,在这些情况下,在不使用内存后释放内存非常重要。

什么是 Rust 取消提交并将内存返回给操作系统的默认策略?
这怎么能改变呢?

memory memory-management rust microservices

4
推荐指数
1
解决办法
381
查看次数

free() 将内存返回给操作系统

我的测试代码显示,在free()程序退出之后和之前,堆内存都返回给操作系统。我使用htop(与 相同top)来观察行为。我的 glibc 版本是ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define BUFSIZE 10737418240 

int main(){
    printf("start\n");
    u_int32_t* p = (u_int32_t*)malloc(BUFSIZE);
    if (p == NULL){
        printf("alloc 10GB failed\n");
        exit(1);
    }
    memset(p, 0, BUFSIZ);
    for(size_t i = 0; i < (BUFSIZE / 4); i++){
        p[i] = 10;
    }
    printf("before free\n");
    free(p);
    sleep(1000);
    printf("exit\n");
}
Run Code Online (Sandbox Code Playgroud)

为什么会出现这个问题为什么 free() 函数不将内存返回给操作系统?观察到与我相反的行为?OP也使用linux,问题是在2018年提出的。我错过了什么吗?

c malloc free

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