标签: memory-management

如何创建动态大小的结构数组?

我知道如何创建一个结构数组但具有预定义的大小.但是有没有办法创建一个动态的结构数组,以便数组可以变得更大?

例如:

    typedef struct
    {
        char *str;
    } words;

    main()
    {
        words x[100]; // I do not want to use this, I want to dynamic increase the size of the array as data comes in.
    }
Run Code Online (Sandbox Code Playgroud)

这可能吗?


我研究了这个: words* array = (words*)malloc(sizeof(words) * 100);

我想摆脱100并存储数据.因此,如果76个数据字段进来,我想存储76而不是100.我假设我不知道有多少数据会来进入我的计划.在我上面定义的结构中,我可以创建第一个"索引":

    words* array = (words*)malloc(sizeof(words));
Run Code Online (Sandbox Code Playgroud)

但是我想在之后动态地向数组中添加元素.我希望我能够清楚地描述问题区域.主要挑战是动态添加第二个字段,至少这是目前的挑战.


然而,我取得了一些进展:

    typedef struct {
        char *str;
    } words;

    // Allocate first string.
    words x = (words) malloc(sizeof(words));
    x[0].str = "john";

    // Allocate second string.
    x=(words*) realloc(x, sizeof(words));
    x[1].FirstName = "bob"; …
Run Code Online (Sandbox Code Playgroud)

c memory-management dynamic

51
推荐指数
3
解决办法
16万
查看次数

C++中"new"和"malloc"和"calloc"有什么区别?

"new"和"malloc"和"calloc"和其他家庭有什么区别?

(何时)除了"新"之外我还需要什么?

其中一个是否使用其他任何一个实现?

c++ heap malloc memory-management

51
推荐指数
5
解决办法
9万
查看次数

有没有办法在不使用时降低Java堆?

我目前正在研究Java应用程序并努力优化其内存使用.据我所知,我正在遵循适当的垃圾收集指南.但是,即使不需要,我的堆似乎仍然处于最大大小.

我的程序每小时运行一次资源密集型任务,当一个人没有使用计算机时.此任务使用了相当大的内存块,但在任务完成后立即释放所有内存.NetBeans探查器显示内存使用情况如下所示:

Java程序内存使用情况

我真的很想在不使用时将所有堆空间都交还给操作系统.没有理由让我把它全部用掉,而程序甚至不会在至少一个小时内做任何事情.

这可能吗?谢谢.

java heap memory-management

51
推荐指数
3
解决办法
2万
查看次数

alloc和allocWithZone有什么区别:?

论坛讨论看,似乎最大的区别是性能因素,allocWithZone:将从特定的内存区域分配内存,从而降低交换成本.

在实践中,几乎没有机会使用allocWithZone:,任何人都可以给出一个简单的例子来说明使用allocWithZone的情况:

谢谢,

memory-management objective-c alloc

50
推荐指数
3
解决办法
2万
查看次数

在数组中存储块

在Objective-C中,我知道块被认为是对象,所以我想知道是否可以将它们存储在数组中.这引出了一个问题,是阻塞第一类对象还是只是为了在对象之间传递它们而被视为对象?如果它们是第一类对象,那么它们不应该存储在数组中吗?

memory-management objective-c objective-c-blocks

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

这个GCC错误"......重定位被截断以适应......"是什么意思?

我正在编程主机 - 加速器系统的主机端.主机在Ubuntu Linux下的PC上运行,并通过USB连接与嵌入式硬件通信.通过将存储器块复制到嵌入式硬件的存储器和从嵌入式硬件的存储器复制来执行通信.

在主板的内存中有一个内存区域,我用它作为邮箱,我在其中写入和读取数据.邮箱定义为结构,我使用相同的定义在主机空间中分配镜像邮箱.

我过去成功地使用了这种技术,所以现在我将主机Eclipse项目复制到我当前项目的工作区,并进行了相应的名称更改.奇怪的是,在构建主机项目时,我现在收到以下消息:

构建目标:fft2d_host
调用:GCC C链接器
gcc -L/opt/adapteva/esdk/tools/host/x86_64/lib -o"fft2d_host"./ src /fft2d_host.o -le_host -lrt

./src/fft2d_host.o:在函数`main'中:

fft2d_host.c :(.text + 0x280):重定位被截断以适合:R_X86_64_PC32对./src/fft2d_host.o中COMMON部分中定义的符号`Mailbox'

这个错误意味着什么以及为什么它不会建立在当前项目上,而旧项目是否可以?

c eclipse embedded gcc memory-management

50
推荐指数
6
解决办法
10万
查看次数

如何强制JavaScript深度复制字符串?

我有一些javascript代码,如下所示:

var myClass = {
  ids: {}
  myFunc: function(huge_string) {
     var id = huge_string.substr(0,2);
     ids[id] = true;
  }
}
Run Code Online (Sandbox Code Playgroud)

稍后,使用一些大字符串(100 MB +)调用该函数.我只想保存我在每个字符串中找到的短ID.但是,Google Chrome的子字符串函数(在我的代码中实际为正则表达式)只返回一个"切片字符串"对象,该对象引用原始对象.因此,在一系列调用之后myFunc,我的chrome选项卡内存不足,因为临时huge_string对象无法进行垃圾回收.

如何制作字符串的副本,id以便huge_string不维护对该字符串的引用,并且huge_string可以对其进行垃圾回收?

在此输入图像描述

javascript garbage-collection memory-management google-chrome

50
推荐指数
5
解决办法
5万
查看次数

如何为静态变量分配内存?

在以下程序中:

class Main
{   
    static string staticVariable = "Static Variable";
    string instanceVariable = "Instance Variable";

    public Main(){}   
}
Run Code Online (Sandbox Code Playgroud)

instanceVariable将存储分配给对象实例的记忆里.staticVariable存储在哪里,是存储在对象实例本身还是其他地方?如果它存储在其他地方,内存位置如何连接?

.net c# memory-management

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

在IPython中释放巨大的numpy数组的内存

更新: - 这个问题在机器重启后解决了.还没有弄清楚为什么之前发生这种错误.

我有一个函数加载一个巨大的numpy数组(~980MB)并返回它.

当我第一次启动Ipython并调用此函数时,它会将数组加载到变量中而没有任何问题.

但是,如果我再次运行相同的命令,它将退出提出"内存错误".

我试过以下,

del hugeArray
Run Code Online (Sandbox Code Playgroud)

仍然发生同样的错误.我甚至尝试了以下内容

del hugeArray
gc.collect()
gc.collect()
Run Code Online (Sandbox Code Playgroud)

最初,gc.collect()返回145并且第二次调用返回48.但即使在此之后我调用该函数时,仍然会引发内存错误.

我可以再加载的唯一方法是重启ipython.我可以做些什么来释放ipython中的所有内存,以便我不必重新启动它?

----------------更新

以下是输出 %whos

Variable   Type      Data/Info
------------------------------
gc         module    <module 'gc' (built-in)>
gr         module    <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'>
np         module    <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
plt        module    <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'>
Run Code Online (Sandbox Code Playgroud)

除此之外,gr是我的模块,包含我用来加载数据立方体的函数.

---------如何重现错误

以下简单函数能够重现错误.

import numpy as np
import gc

def functionH():
    cube=np.zeros((200,1024,1024))
    return cube

testcube=functionH()   #Runs without any issue 

del testcube
testcube=functionH()  # Raises Memory Error

del testcube
gc.collect()
gc.collect()
testcube=functionH()  # Still Raises …
Run Code Online (Sandbox Code Playgroud)

python memory-management numpy ipython

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

关于VSS/RSS/PSS/USS的解释是否准确?

我读了关于VSS/RSS/PSS/USS的解释:


这篇文章的目的是提供有助于解释各种工具的内存报告的信息,以便确定Linux进程和系统的真正内存使用情况.

Android有一个名为procrank(/ system/xbin/procrank)的工具,它按从高到低的顺序列出了Linux进程的内存使用情况.每个过程报告的大小是VSS,RSS,PSS和USS.

为了本说明书的简单起见,存储器将以页面而不是字节表示.像我们这样的Linux系统在最低级别管理4096字节页面的内存.

VSS(从ps报告为VSZ)是进程的总可访问地址空间.此大小还包括可能不驻留在RAM中的内存,如已分配但未写入的malloc.VSS几乎没有用于确定进程的实际内存使用情况.

RSS是进程RAM中实际保存的总内存.RSS可能会产生误导,因为它报告了该进程使用的所有共享库的总数,即使共享库仅加载到内存中一次,无论有多少进程使用它.RSS不能准确表示单个进程的内存使用情况.

PSS与RSS的不同之处在于它报告其共享库的比例大小,即如果三个进程都使用具有30个页面的共享库,则该库将仅向为三个进程中的每个进程报告的PSS贡献10个页面.PSS是一个非常有用的数字,因为当系统中所有进程的PSS相加时,这是系统中总内存使用量的良好表示.当进程被终止时,为其PSS贡献的共享库将按比例分配给仍在使用该库的其余进程的PSS总计.这样,PSS可能会产生一些误导,因为当一个进程被终止时,PSS无法准确地表示返回整个系统的内存.

USS是进程的总私有内存,即该进程完全独特的内存.USS是一个非常有用的数字,因为它表示运行特定进程的真正增量成本.当进程被终止时,USS是实际返回给系统的总内存.当最初怀疑某个进程中的内存泄漏时,USS是最好的数字.

对于具有Python可用的系统,还有一个名为smem的漂亮工具,它将报告包括所有这些类别的内存统计信息.

# procrank
procrank
PID      Vss        Rss           Pss         Uss   cmdline
481   31536K   30936K   14337K    9956K  system_server
475   26128K   26128K   10046K    5992K  zygote
526   25108K   25108K    9225K    5384K  android.process.acore
523   22388K   22388K    7166K    3432K  com.android.phone
574   21632K   21632K    6109K    2468K  com.android.settings
521   20816K   20816K    6050K    2776K  jp.co.omronsoft.openwnn
474    3304K    3304K    1097K     624K   /system/bin/mediaserver
37     304K      304K     289K      288K  /sbin/adbd
29     720K      720K     261K      212K  /system/bin/rild
601     412K     412K     225K      216K  procrank
   1 …
Run Code Online (Sandbox Code Playgroud)

android memory-management

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