标签: memory-management

如何处理@synthesized的版本保留属性?

我对Objective-C中的合成属性有一些疑问.完整列表如下,但基本问题是:编译器如何确保正确释放合成属性的ivars,即使我的代码可能包含或不包含dealloc中的release方法?

注意:我决定不将这些问题作为单独的问题发布,因为它们密切相关,并且因为有一些现有的问题涉及到个别问题,而没有真正了解问题的核心.

有些类似的问题:


设置:考虑具有单个属性的类:

@interface Person : NSObject
{
    NSString * name;
}
@property (nonatomic, retain) name;
@end
Run Code Online (Sandbox Code Playgroud)

问题#1:最基本的案例:

@implementation Person
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)

通过这种设置,我假设name每当一个Person对象被释放时它将自动释放.在我看来,编译器只是插入[name release]dealloc方法中,就像我自己键入它一样.那是对的吗?


问题2:如果我选择dealloc为这个类编写我自己的方法,并且我省略了一个调用[name release],那会泄漏吗?

@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Run Code Online (Sandbox Code Playgroud)

问题3:如果我选择dealloc为这个类编写我自己的方法,并且我包含一个调用[name release],那会导致双重释放,因为@synthesize已经为我处理了它吗?

@implementation Person
@synthesize name;
- (void)dealloc { [name release]; …
Run Code Online (Sandbox Code Playgroud)

compiler-construction memory-management properties objective-c

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

在不同的功能中分配空闲内存?

我正在尝试学习C而我正在尝试编写一个基本的堆栈数据结构,但我似乎无法获得基本malloc/ free正确.

这是我一直在使用的代码(我只是在这里发布一小部分来说明一个特定的问题,而不是总代码,但错误消息是通过运行此示例代码生成的valgrind)

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

typedef struct Entry {
    struct Entry *previous;
    int value;
} Entry;

void destroyEntry(Entry entry);

int main(int argc, char *argv[])
{
    Entry* apple;
    apple = malloc(sizeof(Entry));
    destroyEntry(*(apple));
    return 0;
}

void destroyEntry(Entry entry)
{
    Entry *entry_ptr = &entry;
    free(entry_ptr);
    return;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它valgrind--leak-check=full --track-origins=yes,我收到以下错误:

==20674== Invalid free() / delete / delete[] / realloc()
==20674==    at 0x4028E58: free (vg_replace_malloc.c:427)
==20674==    by 0x80485B2: destroyEntry (testing.c:53)
==20674==    by 0x8048477: …
Run Code Online (Sandbox Code Playgroud)

c malloc free pointers memory-management

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

为类型化内存视图分配内存的推荐方法是什么?

有关类型化内存视图Cython文档列出了三种分配给类型化内存视图的方法:

  1. 从原始C指针,
  2. 来自np.ndarray
  3. 来自a cython.view.array.

假设我没有从外部传入我的cython函数的数据,而是想分配内存并将其作为a返回np.ndarray,我选择了哪些选项?还假设该缓冲区的大小不是编译时常量,即我不能在堆栈上分配,但需要malloc选项1.

因此,3个选项可以解释如下:

from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view

np.import_array()

def memview_malloc(int N):
    cdef int * m = <int *>malloc(N * sizeof(int))
    cdef int[::1] b = <int[:N]>m
    free(<void *>m)

def memview_ndarray(int N):
    cdef int[::1] b = np.empty(N, dtype=np.int32)

def memview_cyarray(int N):
    cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.

一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.

推荐三种方法中的哪一种?或者有更好的选择吗? …

python memory buffer memory-management cython

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

在PHP中需要一个类似于数组的结构,内存使用量最少

在我的PHP脚本中,我需要创建一个> 600k整数的数组.不幸的是,我的web服务器memory_limit设置为32M,所以在初始化数组时,脚本会中止消息

致命错误:8/home/www/myaccount/html/mem_test.php中允许的内存大小为33554432字节(试图分配71个字节)

我知道PHP不会将数组值存储为普通整数,而是存储为比普通整数值大得多的z值(在我的64位系统上为8个字节).我写了一个小脚本来估计每个数组条目使用多少内存,事实证明,它恰好是128个字节.128!我需要> 73M才能存储阵列.不幸的是,网络服务器不在我的控制之下,所以我无法增加memory_limit.

我的问题是,在PHP中是否有可能创建一个使用更少内存的类似数组的结构.我不需要这种结构是关联的(普通的索引访问就足够了).它也不需要动态调整大小 - 我确切知道数组的大小.此外,所有元素都是相同的类型.就像一个好旧的C阵列.


编辑: 所以deceze的解决方案与32位整数一起开箱即用.但即使您使用的是64位系统,pack()似乎也不支持64位整数.为了在我的数组中使用64位整数,我应用了一些位操作.也许下面的片段对某些人有帮助:

function push_back(&$storage, $value)
{
    // split the 64-bit value into two 32-bit chunks, then pass these to pack().
    $storage .= pack('ll', ($value>>32), $value);
}

function get(&$storage, $idx)
{
    // read two 32-bit chunks from $storage and glue them back together.
    return (current(unpack('l', substr($storage, $idx * 8, 4)))<<32 |
            current(unpack('l', substr($storage, $idx * 8+4, 4))));
}
Run Code Online (Sandbox Code Playgroud)

php arrays memory-management out-of-memory

65
推荐指数
5
解决办法
7325
查看次数

内存泄漏检测工具

Apple的Xcode开发环境是否提供了任何内存泄漏检测工具?

我对适用于iPhone SDK的工具特别感兴趣.目前我最喜欢的业余爱好编程项目平台

所述工具的文档/教程非常有用.

iphone xcode memory-leaks memory-management

64
推荐指数
6
解决办法
8万
查看次数

获取进程的CPU和内存使用情况的正确性能计数器是什么?

如何使用.NET 类获取特定进程的CPU内存使用情况PerformanceCounter?还有什么区别

Processor\% Processor TimeProcess\% Processor Time

我对这两者感到有些困惑.

c# memory-management performancecounter cpu-usage

64
推荐指数
1
解决办法
11万
查看次数

如何在JavaScript中释放内存

我正在使用canvas及其ImageData对象,它包含大量数据(数百万个整数).因此,使用几个阵列已占用大量内存(最多300MB).有没有办法在没必要时释放某些阵列的内存?我正在尝试分配undefined给该变量.这样对吗?

javascript arrays memory-management html5-canvas

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

L1和L2缓存的行大小

从以前的问题,在这个论坛上,我了解到,在大多数存储系统中,L1缓存L2缓存的子集,是指从L2删除任何条目也从L1删除.

所以现在我的问题是如何在L1缓存中为L2缓​​存中的条目确定相应的条目.存储在L2条目中的唯一信息是标签信息.根据此标记信息,如果我重新创建addr,如果L1和L2缓存的行大小不相同,它可能会跨越L1缓存中的多行.

该体系结构是否真的打扰了两条线路,或者它只是保持具有相同线路大小的L1和L2缓存.

我知道这是一个政策决定,但我想知道常用的技术.

caching memory-management computer-architecture

64
推荐指数
3
解决办法
8万
查看次数

在C#中追加数组的最有效方法?

我以双打数组的形式从旧式ActiveX中提取数据.我最初并不知道我将实际检索的样本的最终数量.

将这些数组连接到系统中时,将这些数组连接在一起的最有效方法是什么?

c# arrays memory-management

63
推荐指数
7
解决办法
14万
查看次数

在Linux中,如何判断正在使用多少内存进程?

我想我的LAMP应用程序可能有内存泄漏(内存耗尽,交换开始被使用等).如果我能看到各种进程使用了​​多少内存,它可能有助于我解决我的问题.有没有办法让我在*nix中看到这些信息?

unix linux memory-leaks memory-management

63
推荐指数
10
解决办法
12万
查看次数