标签: memory-management

在这种情况下如何处理内存管理?

我有两个类,一个处理数据库连接的类和一个实体类.db类有一个名为GetEntityByID的实例方法:(int)entity_id.此方法执行简单的select语句,并使用init方法创建Entity类实例.

这样可以正常工作,但是调用GetEntityByID的人必须记得释放它.由于GetEntityByID不是"init"方法,因此这似乎不正确.在这种情况下,如何最好地处理内存管理?

memory-management objective-c autorelease

0
推荐指数
1
解决办法
123
查看次数

在python中重新分配列表

好的,这是我的问题。我正在尝试这样的事情:

for i in big_list:
   del glist[:]

   for j in range(0:val)
         glist.append(blah[j])
Run Code Online (Sandbox Code Playgroud)

想法是重置列表,并将其重新用于下一组数据点。问题是由于某种原因,如果第一个列表有3分,

glist[0]
glist[1]
glist[2]
Run Code Online (Sandbox Code Playgroud)

下一个列表将从索引3继续,并将最后3个元素存储在这些索引中

glist[0] = 4th elem of new list
glist[1] = 5th elem of new list
glist[2] = 6th elem of new list
glist[3] = 1st elem of new list
glist[4] = 2nd elem of new list
glist[5] = 3rd elem of new list
Run Code Online (Sandbox Code Playgroud)

我确定这是分配空间的问题。但是我如何才能实现此del g_list [:],所以结果是,

glist[0] = 1st elem of new list
glist[1] = 2nd elem of new list
glist[2] = 3rd elem …
Run Code Online (Sandbox Code Playgroud)

python collections memory-management list

0
推荐指数
1
解决办法
469
查看次数

具有属性的内存管理

我开始在objective-c中更好地理解内存管理,但有些东西我不明白.这是一个属性声明:

@property (nonatomic, retain)UILabel *myLabel;
Run Code Online (Sandbox Code Playgroud)

这是它看不见的合成二传手(我认为):

- (void)setMyLabel:(UILabel *)newValue {
    if(myLabel != newValue) {
        [myLabel release];
        myLabel = [newValue retain];
    }
}
Run Code Online (Sandbox Code Playgroud)

这节省了你每次保留和填充的所有工作,但是说我第一次设置我的属性,它还没有被分配,所以它的引用数是0,对吧?所以我这样做

UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];
Run Code Online (Sandbox Code Playgroud)

我不确定那里会发生什么,什么时候什么也没发布,但是说这个属性已经有了值,我们设置了它.在setter中,首先它被释放.那不是让它消失吗?如果它的引用计数是1,然后在它发布的setter中,它如何保持设置为保留的新值?

谢谢!!

memory-management properties objective-c retain

0
推荐指数
1
解决办法
1438
查看次数

在.Net中实现多个接口和对象实例

以下是我正在做的一个简单示例.基本上,我有多个接口可以由1个类或单独的类实现,因此我将每个接口存储在应用程序中.我唯一的问题是变量myInterface,yourInterface和ourInterface. 他们引用相同的对象还是有3个不同的对象?

interface IMyInterface
{
    void MyFunction();
}

interface IYourInterface()
{
    void YourFunction();
}

interface IOurInterface()
{
    void OurFunction();
}

public class MainImplementation : IMyInterface, IYourInterface, IOurInterface
{
    public void MyFunction() { }
    public void YourFunction() { }
    public void OurFunction() { }
}

private IMyInterface myInterface;
private IYourInterface yourInterface;
private IOurInterface ourInterface;

static void Main(string[] args)
{
    myInterface = new MainImplementation() as IMyInterface;
    yourInterface = myInterface as IYourInterface;
    ourInterface = myInterface as IOurInterface;
}
Run Code Online (Sandbox Code Playgroud)

额外奖励:有更好的方法吗?

.net c# memory-management

0
推荐指数
1
解决办法
1380
查看次数

在delphi DLL中使用delphi应用程序的内存管理器(无需重新编译应用程序)

我需要编写一个DLL(使用Delphi),它动态加载到delphi应用程序中并进行RTTI查询(典型的操作是获取控件属性的字符串值).经典的问题是在应用程序和DLL之间传递字符串(和对象)是有问题的,因为两者中使用了不同的内存管理器(这可能导致内存问题,例如DLL的内存管理器会尝试释放由Application的内存管理器分配的内存).

有没有办法以不依赖于delphi版本的方式将DLL的内存管理器设置为应用程序的内存管理器?有什么想法吗?

2010年10月编辑:

由于对这个主题的兴趣几乎消失了 - 我将描述我最终得到的(非常差的)解决方案,以便其他人理解为什么我不接受任何建议的答案.

因此,一个哈克的方式来执行这样的事情是要找到RVAMemoryManager结构(参见System.pas的实现部分)和DLL硬编码.这样,DLL就能够将其私有内存管理器设置为与其加载的应用程序相同.它适用于一些限制和问题; 无论如何 - 它非常依赖于Delphi编译器和链接器选项.

虽然这不是我正在寻找的答案 - 我没想到比这更好的东西.

delphi dll memory-leaks memory-management

0
推荐指数
1
解决办法
2031
查看次数

free()错误(用valgrind调试)?

我有这些结构:

typedef struct _Frag{
  struct _Frag *next;
  char *seq;
  int x1; 
  int length;  
}Frag;

typedef struct _Fragment{ 
  int type; 
  Frag *frag_list;   
}Fragment;
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个数组

Fragment *fragments=malloc(1,sizeof(Fragment)); // or more
fragments->frag_list=malloc(1,sizeof(Frag)); // or more
Frag *frag=malloc(10,sizeof(Frag));
frag->seq="test str\n";
...
frag->next=malloc(1,sizeof(Frag));
frag->next->seq="test str\n";
Run Code Online (Sandbox Code Playgroud)

在程序结束时,我想释放内存,功能是:

static void free_frags(){
  int i;
  Fragment *fragment;
  Frag *current,*next;
  for(i=0;i<1;i++){
    fragment=&snp_frags[i];
    current=fragment->frag_list;
    next=current->next;

    while(next!=NULL){
      free(current->seq);
      //free(current->next);
      free(current);
      current=next;
      next=current->next;
    }
    free(current->seq);
    //free(current->next);
    free(current);
    //free(fragment->frag_list);
    free(&snp_frags[i]);
  }
  free(snp_frags);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用valgrind来调试它,valgrind说:

=============================================
==3810== Invalid read of size 4
==3810==    at 0x80490FD: …
Run Code Online (Sandbox Code Playgroud)

c free valgrind memory-leaks memory-management

0
推荐指数
1
解决办法
1332
查看次数

调整大小时的relloc行为

当relloc必须将分配的内存大小调整为更大的大小时,它是如何表现的,并且必须在单独的内存区域中完成,因为所请求的内存量可以在适当的位置调整大小.原始内存是否由relloc自动解除分配(我会这么认为)或者必须由程序员完成(不太可能)?

c memory-management

0
推荐指数
1
解决办法
1055
查看次数

我可以使用内存区域来杀死iPhone泄漏吗?

我有一个C++类,我在我的iPhone应用程序中使用我的Objective-C++控制器.C++类对某些数据进行一些计算,返回结果,然后完成 - 但它会像疯了一样泄漏.我想知道我是否能够以某种方式利用Memory Zones(又名malloc区域又名allocWithZone)来解决这个问题.我的想法是将ObjC++对象分配到一个新区域,然后以某种方式让C++对象全部在这个新区域中自动创建.然后,当它返回时,我杀死该区域,并且所有内存将自动恢复,即使它已被泄露.

但是:文档似乎表明我是否在新区域X中分配了一个对象,它分配的对象也不会自动也在区域X中.如果这有意义,是否有人知道如何覆盖该行为以便所有后续的分配和该对象的mallocs将在新区X中?

编辑:

  1. 我应该注意,该线程将主要运行C++代码,一个庞大的代码库,并且此时杀死它中的所有泄漏并不经济,因为它自动从Java转换而且像疯了一样泄漏(重构)需要...).感谢"只是修复你的漏洞"的建议,但目前这并不实用.

  2. 内存不会通过ObjC分配泄露,但主要是通过C++数组新调用(也有几个直接的malloc).如果这有所作为.

iphone malloc memory-leaks memory-management

0
推荐指数
1
解决办法
451
查看次数

NSThread有一个单独的堆吗?怎么样pthread(在iPhone上)

如果我分离NSThread将Cocoa运行在一个单独的内存堆或内存区域?例如,如果我要分离一个线程,使用malloc创建一个大缓冲区,然后让线程退出,我会在某种自动线程清理中恢复该内存,还是会被泄露?

如果我使用POSIX线程(pthread)呢?

请注意,我对ObjC allocs或autorelease pool不感兴趣,我说的是低级缓冲区,例如int*foo = malloc(100000);

iphone cocoa memory-management pthreads nsthread

0
推荐指数
1
解决办法
695
查看次数

向已释放的对象发送消息正在起作用

Objective-C中最简单的代码会导致奇怪的行为:

#import Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSObject *obj = [[NSObject alloc] init];
    NSLog(@"retain count %d",[obj retainCount]);//print 1
    [obj release];//obj deallocated
    NSLog(@"retain count %d",[obj retainCount]); //still printing 1 in Snow Leopard! Why??


    [pool drain];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二个NSLog()应该打印"message retainCount send to freed object = 0x103eb0".如果你使用Leopard一切正常,但在Snow Leopard中,第二个NSLog仍然可以打印1.

这是雪豹版Xcode中的一个错误吗?

cocoa memory-management objective-c

0
推荐指数
1
解决办法
1261
查看次数