代码之家  ›  专栏  ›  技术社区  ›  RK-

有C++等价于Objto-C的自动重读吗?

  •  2
  • RK-  · 技术社区  · 15 年前

    +(UIButton*)getButton:(CGRect)frame{
    
    
    UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    [button setTitle:@"Some title" forState:UIControlStateNormal];
    
    button.frame=frame;
    
    return button;
    }
    

    在C++中也可以这样做吗?我并不是在问C++中的UBITCON的创建。

     CString getCstring(some parameters)
    {
    
        CString string = L"Hi sampe string.";
        return string;
    
     }
    

    对于Objective-C代码,我们可以保留自动释放的对象来使用它。C++中有没有这样的机制?

    4 回复  |  直到 13 年前
        1
  •  3
  •   fschmitt    15 年前

    在C++中你可以做

    CString* getCString(some parameters)
    {
    
        CString* string = new CString(L"Hi sample string.");
        return string;
    
     }
    

    如果希望将字符串放在堆中,则在调用者处理完字符串后,删除(通过在指针上调用delete)调用者中的字符串。但是在你发布的第一个版本中,我看没有问题。它是一个堆栈变量,但当然它在调用者中仍然有效,因为它是返回值。

        2
  •  3
  •   Konrad Rudolph    15 年前

    它不会丢失它的值,因为它将被复制(尽管编译器可以将复制作为优化省略)。

    所以不用担心,这在C++中是很好的。

    您还可以返回指向动态分配内存的指针,但这会增加使用难度,因为客户端必须显式释放内存。一般来说,这不是一个好的解决方案,处理指向动态内存的原始指针是导致内存泄漏的首要原因,清理此类代码非常糟糕。

    更好的方法是使用智能指针(例如。 shared_ptr unique_ptr )它们自己负责内存管理。

        3
  •  1
  •   liaK    15 年前

    你的 string return string; 将只返回

        4
  •  1
  •   Eiko    15 年前

    您的Obj-C代码与编码样式和内存管理规则相违背。它应该看起来像:

    +(UIButton*)buttonWithFrame:(CGRect)aRect {
      UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
      [button setTitle:@"Some title" forState:UIControlStateNormal];
      button.frame = aRect;
      return button;
    }