标签: dynamic-memory-allocation

堆内存分配

如果我在我的程序中使用动态分配内存malloc()但在程序运行时没有释放内存,那么在程序终止后是否会释放动态分配的内存?

或者如果它没有被释放,并且我一遍又一遍地执行相同的程序,它每次都会分配不同的内存块吗?如果是这样的话,我应该如何释放这段记忆?

注意:我能想到的一个答案是重新启动我正在执行程序的机器.但是,如果我在远程计算机上执行程序并且重启不是一个选项?

c memory malloc dynamic-memory-allocation

15
推荐指数
2
解决办法
1072
查看次数

为什么 malloc() 可以互换调用 mmap() 和 brk()?

我是 C 和堆内存的新手,仍在努力理解动态内存分配。

我跟踪了Linux系统调用,发现如果我malloc用来请求少量的堆内存,那么内部malloc调用brk

但是如果我使用malloc请求非常大量的堆内存,则在内部malloc调用mmap

所以必须有一个很大的区别brkmmap,但理论上我们应该能够使用brk分配堆内存无论请求的大小。那么为什么在分配大量内存时会malloc调用mmap呢?

c linux heap-memory linux-kernel dynamic-memory-allocation

15
推荐指数
2
解决办法
1021
查看次数

使用运算符new/malloc分配的内存块是否可以在程序执行结束后持续存在?

可能重复:
退出C应用程序时,是否自动释放了malloc-ed内存?

当我读到关于在C/C++中动态内存分配时分别使用delete/free是多么强制时,我才想到这个问题.我想如果内存分配持续超出我的程序执行终止,那么是的,它是强制性的; 否则,为什么我要担心释放分配的空间?操作系统是否会在进程终止时自动释放它?我是对的吗?我的问题是可以的

int *ip = new int(8);
Run Code Online (Sandbox Code Playgroud)

坚持超越我的计划终止?

c c++ dynamic-memory-allocation

14
推荐指数
4
解决办法
2139
查看次数

CUDA新删除

有人可以清楚解释新的和删除关键字在CUDA 4.2中调用__device____global__代码时的行为吗?

内存如何分配,如果它在设备上是本地的还是全局的?

我试图在GPU上创建神经网络的问题的上下文条款,我想要一个链接表示(像链表,但每个神经元存储一个链接的连接列表,其中包含权重,指向其他神经元),我知道我可以cudaMalloc在内核启动之前分配使用,但我希望内核控制网络的创建方式和时间.

谢谢!

cuda dynamic-memory-allocation

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

"new int [5] {};"中"{}"的目的是什么?

如果我们写下这样的话:

int *arr = new int[5];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,系统为5个类型的元素动态分配空间,int并返回指向序列的第一个元素的指针.

但是,一旦我看到以下代码:

int *arr = new int[5]{};
Run Code Online (Sandbox Code Playgroud)

那么,运营商{}之后的意义new何在?{}这段代码的目的是什么?

我用自己的值初始化了数组,如下所示:

#include <iostream>

int main()
{
    int* a = new int[5]{1};
    for(int i = 0; i < 5; i++)
        std::cout<< a[i]<<' ';

    delete[] a;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

只有第一个元素打印1.为什么?

c++ initialization new-operator dynamic-memory-allocation c++11

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

_int_malloc和malloc之间有什么区别(在Valgrind中)

我很惊讶我找不到任何文件说明Valgrind 工具的输出_int_mallocmalloc输出之间的区别callgrind.

有人可以解释一下他们的区别吗?

此外,我实际上编写C++代码,所以我完全new不使用malloc,但在callgrind输出中只显示mallocs.

malloc valgrind memory-management dynamic-memory-allocation

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

数据结构存储大量数据?

在我的应用程序中,我必须从一组图像(MRC图像)加载volumedata并将像素数据保存在内存中.(图像是灰度级的,因此每像素一个字节).

我的开发环境是QT框架,MinGW for Windows和GCC for Linux.

目前,我使用一个简单的数据结构来存储volumedata:

unsigned char *volumeData;
Run Code Online (Sandbox Code Playgroud)

并按如下方式进行大量分配.

volumeData=new unsigned char[imageXsize * imageYsize * numofImages];
Run Code Online (Sandbox Code Playgroud)

以下是访问给定平面中图像数据的重要方法,例如

unsigned char* getXYPlaneSlice(int z_value);
unsigned char* getYZPlaneSlice(int x_value);
unsigned char* getZXPlaneSlice(int y_value);
Run Code Online (Sandbox Code Playgroud)

使用我简单的数据结构,很容易实现上述方法.

但是我们可能需要在未来采用体积大小为2000x2000x1000(~3.7Gb).而目前的数据结构将无法处理这些庞大的数据.

  1. 如何避免碎片?现在,即使使用1000x1000x200数据,应用程序也会崩溃,从而导致bad_alloc.什么是更改数据结构的最佳方法?我应该使用链接列表,每个块大小为100mb.

  2. 此外,用户应该能够在体积数据上执行一些图像处理过滤器,并且还应该能够重置为原始像素值.这意味着,我应该保留两份卷数据.与目前的实施类似.

    unsigned char*volumeDataOriginal;

    unsigned char*volumeDataCurrent;

因此,对于2000x2000x1000数据范围,它将使用大约8Gb(每个音量4Gb).但在Win32中,地址空间为4GB.如何解决这个问题?我应该使用64位应用程序?

编辑:这是我的应用程序的快照 在此输入图像描述

基本上,我加载了体积数据(来自MRC格式的图像集),并将它们显示在不同的平面查看器中(XY,YX,YZ.Image显示XY平面查看器).我需要保持在上面3种数据访问方法,用于显示特定平面中的图像.使用滑块栏用户可以更改要在所选平面中显示的图像)

提前致谢.

c++ memory dynamic-memory-allocation data-structures

12
推荐指数
4
解决办法
9629
查看次数

为数组使用动态内存分配

我怎么能对数组使用动态内存分配?

例如,下面是一个数组,其中我从.txt文件中读取单个单词并在数组中逐字保存:

码:

char words[1000][15];
Run Code Online (Sandbox Code Playgroud)

这里1000定义了数组可以保存的单词数,每个单词可以包含不超过15个字符.

现在我希望该程序应该为它计算的单词数量动态分配内存.例如,.txt文件可能包含大于1000的单词.现在我希望程序应该计算单词数并相应地分配内存.

由于我们不能使用变量代替[1000],因此我对如何实现逻辑完全空白.请帮助我这方面.

c memory arrays dynamic-memory-allocation

12
推荐指数
2
解决办法
7万
查看次数

嵌入式系统中的STL,内存非常有限

我目前正在使用带有64 KB SRAM的ARM Cortex M3处理器构建嵌入式系统.目前,我正在寻找一种方法来确保使用STL容器确定性能,其中包括确保在运行时不会最终耗尽内存.

我主要关注STL容器如何执行动态内存分配.虽然我可以利用自定义分配器让这些结构从我预留的池中获取内存,但我需要为每个结构设置一个单独的池,以确保结构的一个实例不能占用另一个实例的空间.

我正在与这个项目中的其他人一起工作,他们不想关注内存的原始分配,并且更愿意能够利用"众所周知的"数据结构(堆栈,队列,双端队列等).因此,我正在考虑围绕C阵列构建包装器以提供这些结构.这将支持静态分配支持这些容器所需的内存,并允许其他开发人员根据编译器提供的代码大小信息知道他们在运行时之前实例化的容器的大小.在我看来,这可以保证在运行时不会发生内存中断问题,并大大简化了系统设计.

另一种选择是在系统初始化时分配STL容器.在初始化期之后,不会发生额外的动态内存分配.但是,据我所知,标准C++ STL数据结构不支持这一点 - 它要求堆栈之类的容器能够预先分配(类似于向量).

对于我关于围绕标准C阵列构建类的提议有什么意见,我将不胜感激?另外,是否有更简单的方法在编译时分配静态大小的STL容器,例如静态大小的堆栈或队列?(我知道这可能是矢量,但其他我不确定)

注意:我已经阅读了另一个问题(嵌入式C++是否使用STL),但是这个问题的作者并未明确他们有多少内存(除了他们如何使用ARM7进程)或似乎是考虑类似于我的解决方案.

第二个注意:我知道对于一些开发人员来说,64 KB的SRAM可能看起来像很多内存.事实上,我已经在AVR处理器上进行了大量减少内存的开发,所以我理解这个观点.但是,从我目前的(可能是未知的)视图来看,在谈论STL容器时,64 KB的内存并不多.

c++ stl deterministic dynamic-memory-allocation static-memory-allocation

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

:: operator new(size_t)是否使用malloc()?

是在内部::operator new(size_t)调用malloc(),还是直接使用系统调用/特定于操作系统的库调用?C++标准说什么?

这个答案中它说:

malloc()保证返回与任何标准类型对齐的地址.::operator new(n)只保证返回一个不大于任何标准类型的地址n,如果T不是一个字符类型,那么new T[n]只需要返回一个对齐的地址T.

这表明new()不需要打电话malloc().

注意:这里有一个SO 问题有关的一切operator new其他比分配.

c++ malloc new-operator dynamic-memory-allocation

12
推荐指数
2
解决办法
3626
查看次数