标签: memory-management

用C++动态增长数组

我有一个CName对象的指针数组.我有以下构造函数初始化我的数组大小一.然后,当我添加一个对象时,我将数组增加1并添加新对象.编译很好,但是当我尝试打印它时,我只是得到分段错误错误.你能看看我是否做错了吗?

//constructor
Names_Book::Names_Book()
{
    grow_factor = 1;
    size = 0;
    cNames = (CName**)malloc(grow_factor * sizeof(CName*));
    cNames[0] = NULL;
}

void Names_Book::addCName(CName* cn)
{
    int oldSize = size;
    int newSize = size + 1;

    CName** newCNames = (CName**)malloc(newSize * sizeof(CName*));

    for(int i=0; i<newSize; i++)
    {
        newCNames[i] = cNames[i];
    }

    for(int i=oldSize; i<newSize; i++)
    {
        newCNames[i] = NULL;


    }
    /* copy current array to old array */
    cNames = newCNames;

    delete(newCNames);

    size++;

}
Run Code Online (Sandbox Code Playgroud)

c++ arrays malloc memory-management dynamic

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

由于保留计数而释放对象

我有一个问题,即发布视图的次数太多了.虽然理论上很简单,因为我将uiview移动到uiview,这是uiview的一个子类,并且是动画的,所以它不是我可以轻松修复的东西.它只会在一定条件下崩溃10%,即使在这些条件下也只有30%的时间.

换句话说,它有点复杂.有时在我的dealloc方法中,此UIView的保留计数已经为1(在视图发布时会释放),因此不应再次释放.所以我做的是这样的:

if ([mainView retainCount] > 1) {
    NSLog(@"released");
    [mainView release];
}
Run Code Online (Sandbox Code Playgroud)

与发布的崩溃一致通常被称为,但并非总是如此,并且当我有时期望它崩溃时它几乎发生.我用这个代码检查了泄漏,它从不泄漏.

现在实际的问题......由于保留计数而释放一些东西是错误的吗?我已经尝试了许多不同的方法来解决这个问题,到目前为止,这是唯一可靠且无泄漏的方法.

编辑:如果没有,那么将一个UIView复制到另一个UIView的更好方法是什么?

mainView = newView;
[newView release];
Run Code Online (Sandbox Code Playgroud)

我尝试先释放mainView,然后在newView上调用copy,但这会崩溃.以上也很有效,除非保留计数有时比预期低1,即使它从未在代码中释放任何其他内容.

memory-management uiview ios retaincount

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

java中的内存管理

哪些对象,变量变量,临时变量都存储在java中?它们是如何被引用的?我知道方法存储在堆栈中.变量存储堆或堆栈的位置?

java memory-management

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

iPhone内存管理

我对内存管理有点失落.我已经读过你应该在你分配的时候发布.但是当你得到一个没有alloc的实例时,你就不应该发布.

这种情况怎么样,只需要知道我是否正确编码.我仍然是iphone dev的新手.

我有一个CustomerRepository类,它有一个方法

- (MSMutableArray *) GetAllCustomers() {

  MSMutableArray *customers = [[MSMutableArray alloc] init];

  Customer *cust1 = [[Customer alloc] init];
  cust1.name = @"John";

  Customer *cust2 = [[Customer alloc] init];
  cust2.name = @"Tony";

  [customers addOjbect:cust1];
  [customers addOjbect:cust2];

  [cust1 release];
  [cust2 release];

  return customers;

}
Run Code Online (Sandbox Code Playgroud)

然后我有一个UIViewController

- (void) LoadCustomers() {

      CustomerRepository *repo = [[CustomerRepository alloc] init];

      MSMutableArray *customers = [repo GetAllCustomers];          

      // Iterate through all customers and do something

      [repo release];

} 
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下...... MSMutableArray永远不会被释放?它应该在哪里发布?

iphone memory-management objective-c

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

如何释放在Objective C中的for循环内创建的数组?

我在for循环中创建了一个数组,但我无法释放它.它显示内存泄漏.这是我的代码:

for(int i = 0; i < [magArr count]; i++)
{
   Magazine *magObj = [magArr objectAtIndex:i];
   NSMutableArray *myArray = [data readEditions:[magObj.magazineID intValue]:0];//returns a array
}
[myArray release]; // memory leaks (retain count to -1)
Run Code Online (Sandbox Code Playgroud)

如果我也使用自动释放,它显示内存泄漏.如何解决这个漏洞?

iphone memory-leaks memory-management

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

为什么我试图发布时会收到"EXC_BAD_ACCESS"?

你能看看我的代码吗:

(void)loadContactsFromAddressBook {
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex count = ABAddressBookGetPersonCount(addressBook);
ABRecordRef person;

for (int i = 0; i < count; i++) {
    person = CFArrayGetValueAtIndex(allPeople, i);
    CFStringRef cfStr = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString* firstName = (NSString*) cfStr;
    [contacts addObject:firstName]; 
    CFRelease(cfStr);
}

CFRelease(addressBook);
CFRelease(allPeople);
}
Run Code Online (Sandbox Code Playgroud)

我在for block之后尝试了CFRelease(person),但是应用程序崩溃了"EXC_BAD_ACCESS".如果我删除CFRelease(人),该应用程序工作.

iphone memory-management objective-c

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

如何使用PHP顺序解析大型XML文件

我正在尝试使用simpleXML在php中解析一个中等大小的XML文件(6mb).该脚本从XML文件中获取每条记录,检查它是否已经被导入,如果没有,则将该记录更新/插入到我自己的数据库中.

问题是我经常遇到超出内存分配的致命错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 256 bytes) in /.../system/database/drivers/mysql/mysql_result.php on line 162
Run Code Online (Sandbox Code Playgroud)

我通过使用以下行来增加最大内存分配来避免该错误(从此处开始提示):

ini_set('memory_limit', '-1');
Run Code Online (Sandbox Code Playgroud)

然而,然后我遇到60秒的最大执行时间,并且,无论出于何种原因,我的服务器(Mac OS X上的XAMPP)都不会让我增加那个时间(如果我尝试包含脚本,脚本就不会运行像:)这样的一行

set_time_limit(240);
Run Code Online (Sandbox Code Playgroud)

然而,这一切似乎都非常低效; 我不应该能够打破文件的顺序并按顺序处理它吗?在下面的控制器中,我有一个计数变量($ cycle)来跟踪我所在的记录,但我无法弄清楚如何实现它仍然不需要处理整个XML文件.

控制器(我正在使用CodeIgniter)具有以下基本结构:

    $f = base_url().'data/data.xml';
    if($data = file_get_contents($f))
    {
        $cycle = 0;
        $xml = new SimpleXMLElement($data);
        foreach($xml->person as $p)
        {

        //this makes a single call to db for single field based on id of record in XML file                
        if($this->_notImported('source',$p['id']))
            {
               //various process here, mainly breaking up the data …
Run Code Online (Sandbox Code Playgroud)

php xml memory-management

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

检查内存是否已初始化

如果我通过:: operator new(nbytes)分配了一些内存,后来我在这个池中通过"new(where)what"构建了一些相应类型的objs(但是小于nbytes),有没有办法检查未初始化的内存在哪里开始?

struct T{};
short noOfObj = 10;
T* p = static_cast<T*>(::operator new(sizeof(T) * noOfObj));
for (short i = 0; i < (noOfObj - 2); ++i)//here I'm constructing two less obj than available mem
{
new (p + i) T();
}
Run Code Online (Sandbox Code Playgroud)

我怎么能检查(不知道noOfObj已经减少了多少)p指向的未初始化内存开始了?(觉得我再次搞砸了语法,但我担心我现在能做的最好)

c++ memory-management

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

解除对象的指针数组?

考虑以下情况:

Class** array = new Class*[8];
array[1] = new Class(1,2);
Run Code Online (Sandbox Code Playgroud)

只是做" delete[ ] array足够"或者我应该在前者之前加上" delete array[1]".我对内存管理并不完全满意.

c++ pointers memory-management

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

dll映像如何在虚拟内存中比硬盘空间大1000倍?

我正在开发一个32位的Windows应用程序,偶尔会耗尽内存(2GB的虚拟地址空间).当我看看如何使用WinDbg或VMMap分配虚拟内存时,我注意到一个dll映像占用了85 MB的虚拟内存空间.具体来说,84 MB是在".data"部分,并具有"写入时复制"保护.但是,当我查看硬盘时,dll只有81 KB.

dll映像如何在虚拟地址空间中比在磁盘上大1000倍?请注意,我只询问"图像",而不是堆或堆栈,或映射内存,只是图像 - 我意识到堆,堆栈,映射内存等当然会是额外的.

memory windows dll memory-management

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