是否存在与Objective-C自动释放相当的C ++?

时间:2010-09-29 11:16:37

标签: c++ objective-c

我可以在Objective-C中以这种方式编写一个函数。这可以用来制作许多UIButtons。

+(UIButton*)getButton:(CGRect)frame{


UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];

[button setTitle:@"Some title" forState:UIControlStateNormal];

button.frame=frame;

return button;
}

可以用C ++完成吗?我不是要求在C ++中创建UIButton。

但是在这个函数的帮助下生成许多对象:

 CString getCstring(some parameters)
{

    CString string = L"Hi sampe string.";
    return string;

 }

我认为在此函数中创建的CString对象将在堆栈​​中,并且一旦离开此函数可能会丢失它的值。

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

4 个答案:

答案 0 :(得分:3)

在C ++中你可以做到

CString* getCString(some parameters)
{

    CString* string = new CString(L"Hi sample string.");
    return string;

 }

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

答案 1 :(得分:3)

  

我认为在这个函数中创建的CString对象将在堆栈​​中,并且一旦离开此函数就可能失去它。

它不会丢失它的值,因为它将被复制(尽管编译器可以将副本作为优化来删除)。

所以不要担心 - 这在C ++中运行得很好。

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

更好的方法是使用智能指针(例如shared_ptrunique_ptr)来处理内存管理。

答案 2 :(得分:1)

您的string变量最终会超出范围,但return string;将仅返回副本,因此您现在可以在C ++中使用它...... < / p>

答案 3 :(得分:1)

您的Obj-C代码适用于编码样式和内存管理规则。它应该看起来像:

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

看起来像是微小的变化,但它使记忆管理(对象所有权)变得明显,并且适当地命名参数。