如果我在我的程序中使用动态分配内存malloc()但在程序运行时没有释放内存,那么在程序终止后是否会释放动态分配的内存?
或者如果它没有被释放,并且我一遍又一遍地执行相同的程序,它每次都会分配不同的内存块吗?如果是这样的话,我应该如何释放这段记忆?
注意:我能想到的一个答案是重新启动我正在执行程序的机器.但是,如果我在远程计算机上执行程序并且重启不是一个选项?
我是 C 和堆内存的新手,仍在努力理解动态内存分配。
我跟踪了Linux系统调用,发现如果我malloc用来请求少量的堆内存,那么内部malloc调用brk。
但是如果我使用malloc请求非常大量的堆内存,则在内部malloc调用mmap。
所以必须有一个很大的区别brk和mmap,但理论上我们应该能够使用brk分配堆内存无论请求的大小。那么为什么在分配大量内存时会malloc调用mmap呢?
当我读到关于在C/C++中动态内存分配时分别使用delete/free是多么强制时,我才想到这个问题.我想如果内存分配持续超出我的程序执行终止,那么是的,它是强制性的; 否则,为什么我要担心释放分配的空间?操作系统是否会在进程终止时自动释放它?我是对的吗?我的问题是可以的
int *ip = new int(8);
Run Code Online (Sandbox Code Playgroud)
坚持超越我的计划终止?
有人可以清楚解释新的和删除关键字在CUDA 4.2中调用__device__或__global__代码时的行为吗?
内存如何分配,如果它在设备上是本地的还是全局的?
我试图在GPU上创建神经网络的问题的上下文条款,我想要一个链接表示(像链表,但每个神经元存储一个链接的连接列表,其中包含权重,指向其他神经元),我知道我可以cudaMalloc在内核启动之前分配使用,但我希望内核控制网络的创建方式和时间.
谢谢!
如果我们写下这样的话:
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
我很惊讶我找不到任何文件说明Valgrind 工具的输出_int_malloc和malloc输出之间的区别callgrind.
有人可以解释一下他们的区别吗?
此外,我实际上编写C++代码,所以我完全new不使用malloc,但在callgrind输出中只显示mallocs.
在我的应用程序中,我必须从一组图像(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).而目前的数据结构将无法处理这些庞大的数据.
如何避免碎片?现在,即使使用1000x1000x200数据,应用程序也会崩溃,从而导致bad_alloc.什么是更改数据结构的最佳方法?我应该使用链接列表,每个块大小为100mb.
此外,用户应该能够在体积数据上执行一些图像处理过滤器,并且还应该能够重置为原始像素值.这意味着,我应该保留两份卷数据.与目前的实施类似.
unsigned char*volumeDataOriginal;
unsigned char*volumeDataCurrent;
因此,对于2000x2000x1000数据范围,它将使用大约8Gb(每个音量4Gb).但在Win32中,地址空间为4GB.如何解决这个问题?我应该使用64位应用程序?
编辑:这是我的应用程序的快照 
基本上,我加载了体积数据(来自MRC格式的图像集),并将它们显示在不同的平面查看器中(XY,YX,YZ.Image显示XY平面查看器).我需要保持在上面3种数据访问方法,用于显示特定平面中的图像.使用滑块栏用户可以更改要在所选平面中显示的图像)
提前致谢.
我怎么能对数组使用动态内存分配?
例如,下面是一个数组,其中我从.txt文件中读取单个单词并在数组中逐字保存:
码:
char words[1000][15];
Run Code Online (Sandbox Code Playgroud)
这里1000定义了数组可以保存的单词数,每个单词可以包含不超过15个字符.
现在我希望该程序应该为它计算的单词数量动态分配内存.例如,.txt文件可能包含大于1000的单词.现在我希望程序应该计算单词数并相应地分配内存.
由于我们不能使用变量代替[1000],因此我对如何实现逻辑完全空白.请帮助我这方面.
我目前正在使用带有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
c++ ×5
c ×4
malloc ×3
memory ×3
new-operator ×2
arrays ×1
c++11 ×1
cuda ×1
heap-memory ×1
linux ×1
linux-kernel ×1
stl ×1
valgrind ×1