标签: memory-management

有没有办法从解释器的内存中删除创建的变量,函数等?

我几天来一直在寻找这个问题的准确答案但是没有任何好处.我不是一个完整的编程初学者,但即使在中级水平也是如此.

当我在Python的shell中时,我输入:dir()我可以看到当前范围(主要块)中所有对象的所有名称,其中有6个:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Run Code Online (Sandbox Code Playgroud)

然后,当我声明一个变量时,例如x = 10,它会自动添加到内置模块下的对象列表中dir(),当我dir()再次键入时,它会立即显示:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
Run Code Online (Sandbox Code Playgroud)

功能,类等也是如此.

如何在不删除开头可用的标准6的情况下删除所有这些新对象?

我在这里读过"内存清理","清理控制台",它会从命令提示符窗口中删除所有文本:

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
Run Code Online (Sandbox Code Playgroud)

但这一切都与我想要实现的目标无关,它并没有清除所有使用过的对象.

python memory-management dir

93
推荐指数
6
解决办法
22万
查看次数

如何在C++类内存结构中创建"spacer"?

问题

低级裸机嵌入式上下文中,我想在内存中创建一个空格,在C++结构中并且没有任何名称,以禁止用户访问这样的内存位置.

现在,我已经通过设置一个丑陋的uint32_t :96;位域来实现它,它将方便地取代三个单词,但它会从GCC发出警告(Bitfield太大而不适合uint32_t),这是非常合理的.

虽然它工作正常,但是当你想要分发一个包含数百个警告的库时它不是很干净......

我该怎么做呢?

为什么首先出现问题?

我正在研究的项目包括定义整个微控制器线路(STMicroelectronics STM32)的不同外设的存储器结构.为此,结果是一个类,它包含几个结构的并集,这些结构定义了所有寄存器,具体取决于目标微控制器.

一个非常简单的外设的一个简单示例如下:通用输入/输出(GPIO)

union
{

    struct
    {
        GPIO_MAP0_MODER;
        GPIO_MAP0_OTYPER;
        GPIO_MAP0_OSPEEDR;
        GPIO_MAP0_PUPDR;
        GPIO_MAP0_IDR;
        GPIO_MAP0_ODR;
        GPIO_MAP0_BSRR;
        GPIO_MAP0_LCKR;
        GPIO_MAP0_AFR;
        GPIO_MAP0_BRR;
        GPIO_MAP0_ASCR;
    };
    struct
    {
        GPIO_MAP1_CRL;
        GPIO_MAP1_CRH;
        GPIO_MAP1_IDR;
        GPIO_MAP1_ODR;
        GPIO_MAP1_BSRR;
        GPIO_MAP1_BRR;
        GPIO_MAP1_LCKR;
        uint32_t :32;
        GPIO_MAP1_AFRL;
        GPIO_MAP1_AFRH;
        uint32_t :64;
    };
    struct
    {
        uint32_t :192;
        GPIO_MAP2_BSRRL;
        GPIO_MAP2_BSRRH;
        uint32_t :160;
    };
};
Run Code Online (Sandbox Code Playgroud)

所有GPIO_MAPx_YYY都是宏,定义为uint32_t :32或寄存器类型(专用结构).

在这里,您可以看到uint32_t :192;哪个效果很好,但它会触发警告.

到目前为止我考虑过的事情:

我可能已经用几个替换它uint32_t :32;(这里有6个),但我有一些极端情况,我有uint32_t :1344;(42)(其中).所以我宁愿不在8k其他行上添加大约100行,即使结构生成是脚本化的.

确切的警告信息是这样的:( width of 'sool::ll::GPIO::<anonymous union>::<anonymous struct>::<anonymous>' …

c c++ memory-management bare-metal low-level

93
推荐指数
6
解决办法
5632
查看次数

术语竞技场与记忆有什么关系?

我正在读一本关于记忆的书作为编程概念.在后面的一章中,作者大量使用了竞技场这个词,但从未定义它.我已经搜索了这个词的含义以及它与记忆的关系,并没有发现任何东西.以下是作者使用该术语的一些背景:

"序列化的下一个例子包含一个称为特定领域内存分配的策略."

"......在处理内存泄漏或从特定领域分配时,这很有用."

"......如果我们想要释放内存,那么我们将解除整个竞技场."

作者在一章中使用了100多次这个词.词汇表中唯一的定义是:

从竞技场分配 - 首先分配竞技场然后通过程序本身管理竞技场内的分配/解除分配的技术(而不是由进程内存管理器); 用于复杂数据结构和对象的压缩和序列化,或用于管理安全关键和/或容错系统中的内存.

在给出这些背景的情况下,任何人都能为我定义竞技场吗?

c c++ memory-management

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

什么是"记忆踩踏"?

我刚刚看到这篇博文中提到了"踩踏记忆":

一个很容易踩踏内存的C++程序(如果你出生在托管代码世界,你可能从未听说过.)

事实上我从未听说过它!

那么,这是什么,内存踩踏,踩踏内存?什么时候发生?

c c++ memory memory-management

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

什么时候应该在C中使用malloc,什么时候不使用?

我理解malloc()是如何工作的.我的问题是,我会看到这样的事情:

#define A_MEGABYTE (1024 * 1024)

char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
some_memory = (char *)malloc(size_to_allocate);
sprintf(some_memory, "Hello World");
printf("%s\n", some_memory);
free(some_memory);
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我省略了错误检查.我的问题是,你不能通过初始化指向内存中某些静态存储的指针来做到这一点吗?也许:

char *some_memory = "Hello World";
Run Code Online (Sandbox Code Playgroud)

在什么时候你真的需要自己分配内存而不是声明/初始化你需要保留的值?

c memory memory-management

91
推荐指数
6
解决办法
7万
查看次数

我怎样才能给eclipse带来比512M更多的内存?

我有以下设置,但是当我放入1024并用1024替换所有512时,那么eclipse根本不会启动.如何为我的eclipse JVM提供超过512M的内存?

-startup
plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
-product
com.springsource.sts.ide
--launcher.XXMaxPermSize
512M
-vm
C:\Program Files (x86)\Java\jdk1.6.0_18\bin\javaw 
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx512m
-XX:MaxPermSize=512m
Run Code Online (Sandbox Code Playgroud)

eclipse memory-management

90
推荐指数
3
解决办法
17万
查看次数

虚拟内存和物理内存有什么区别?

我经常对操作系统中的虚拟化概念感到困惑.考虑将RAM作为物理内存,为什么我们需要虚拟内存来执行进程?

当来自外部硬盘驱动器的进程(程序)被带到主存储器(物理存储器)以执行时,该虚拟存储器在哪里.

谁负责虚拟内存以及虚拟内存的大小?

假设RAM的大小是4GB(即2 ^ 32-1地址空间),虚拟内存的大小是多少?

virtualization ram operating-system memory-management virtual-memory

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

是否有必要在Swift程序中使用autoreleasepool?

它说,在WWDC14演示文稿的第17页

使用Objective-C?还是要管理自动释放池
autoreleasepool {/*code*/}

那是什么意思?这是否意味着如果我的代码库没有任何Objective-C文件,autoreleasepool {}是不必要的?

一个相关问题的答案中,有一个例子autoreleasepool可以是有用的:

- (void)useALoadOfNumbers {
    for (int j = 0; j < 10000; ++j) {
        @autoreleasepool {
            for (int i = 0; i < 10000; ++i) {
                NSNumber *number = [NSNumber numberWithInt:(i+j)];
                NSLog(@"number = %p", number);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果上面的代码被autoreleasepool删除后转换成Swift ,那么Swift是否足够聪明,知道该number变量应该在第一个之后发布}(就像其他语言一样)?

memory-management swift

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

删除void指针是否安全?

假设我有以下代码:

void* my_alloc (size_t size)
{
   return new char [size];
}

void my_free (void* ptr)
{
   delete [] ptr;
}
Run Code Online (Sandbox Code Playgroud)

这样安全吗?或者必须在删除前ptr进行投射char*

c++ memory-management casting void-pointers

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

当仍有大量内存空闲时,抛出'System.OutOfMemoryException'

这是我的代码:

int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
Run Code Online (Sandbox Code Playgroud)

例外:抛出了类型'System.OutOfMemoryException'的异常.

我在这台机器上有4GB内存当我开始运行时,2.5GB是免费的,PC上有足够的空间来处理762mb的100000000随机数.我需要在给定可用内存的情况下尽可能多地存储随机数.当我去生产时,盒子上将有12GB,我想要使用它.

CLR是否将我限制为默认的最大内存?以及如何申请更多?

更新

我认为将其分解为更小的块并逐渐增加我的内存需求将有助于如果问题是由于内存碎片,但它不会无法超过256mb的总ArrayList大小,无论我做什么调整blockSize.

private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();

private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
    for (int i = 0; i < numberOfRandomNumbers; i++) {
      ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));                
  }
}
Run Code Online (Sandbox Code Playgroud)

从我的主要方法:

int blockSize = 1000000;

while …
Run Code Online (Sandbox Code Playgroud)

c# memory-management out-of-memory

86
推荐指数
6
解决办法
25万
查看次数