代码之家  ›  专栏  ›  技术社区  ›  Duck

为什么仪器上说这个代码泄露了?

  •  -3
  • Duck  · 技术社区  · 14 年前

    - (void)cacheBeginPointForTouches:(NSSet *)touches
    {
        if ([touches count] > 0) {
            for (UITouch *touch in touches) {
                CGPoint *point = (CGPoint *)CFDictionaryGetValue(touchBeginPoints, touch);
                if (point == NULL) {
                    point = (CGPoint *)malloc(sizeof(CGPoint));
                    CFDictionarySetValue(touchBeginPoints, touch, point);
                }
                *point = [touch locationInView:self.superview];
            }
        }
    }
    

    仪器指向

     point = (CGPoint *)malloc(sizeof(CGPoint));
    

    作为泄漏管线。

    *point = [touch locationInView:self.superview];
    

    6 回复  |  直到 14 年前
        1
  •  5
  •   mvds    14 年前

    规则 malloc 很简单。一旦你完成记忆, 应该释放它,使用 free(pointer) . 因此,在代码中的某个时刻,字典将用于获取CGPoints。如果您的程序在此之后没有对CGPoints执行任何操作(并且指针已从字典中删除),则应该调用 free(point) 在他们身上。

    *point = ...;
    

    意思是:把 ... point . 字典包含这些指向CGPoint值的指针,如您所见,您可以轻松地先存储指针,然后再填充指向的内存(尽管,我必须承认,这不是很直观)

        2
  •  3
  •   relet    14 年前

    代码段正在泄漏,因为它不完整。它所做的是为CGPoint对象分配内存。当它不再使用时,它必须是免费的。你省略了那部分。

    在本例中,CGPoint对象 似乎

        3
  •  2
  •   Jeff Laing    14 年前

    你可能没有正确地创建词典。常规字典认为您将使用CFRetain/CFRelease模式来保持对象—但是,您可以附加使用您自己的内存管理方案的备用处理程序。

    您应该检查代码中的CFDictionaryNew()调用,并确保它与Erica的匹配。我怀疑她有值回调的自定义值,而你可能没有。

        4
  •  1
  •   Andrew    14 年前

    在不知道上下文的情况下,我猜编译器不喜欢不检查malloc是否失败(malloc=内存分配,它获取可用内存并将其分配给程序变量)。另外,这个片段本身并不能释放malloc的内存(尽管我假设这是在其他地方完成的)。

     int val = 1;
     int *p = &val;
     printf("%d\n",*p);
     *p = 2;
     printf("%d\n",*p);
    

    我会得到:

     1
     2
    

    *允许您引用指针指向的对象。在上面的例子中,“p”是指针,但是“*p”是指针引用的实际值(“val”)。

        5
  •  1
  •   Seamus Campbell    14 年前

    这里不清楚是否存在实际的内存泄漏,因为指针存储在字典中。当字典被销毁或该键的值被覆盖时,必须释放内存。


    至于线路:

    *point = [touch locationInView:self.superview];
    

    解引用 接线员。

        6
  •  0
  •   5ound    14 年前