【问题标题】:Operator New in function call函数调用中的运算符 New
【发布时间】:2013-04-25 12:46:46
【问题描述】:
void F(A* a)
{
    delete a; 
};

F(new A());

delete 操作符会释放分配的内存还是我必须像这样创建和删除对象:

F(A* a) {} 

A a = new A();
F(a);
delete a;

【问题讨论】:

  • 您的第二个版本会导致双重删除。
  • @KerrekSB“白痴”有点远。他问了一个简单而有效的问题。
  • @Named:我一直为了好玩而编写愚蠢的代码。我只是小心不要将其检入生产系统:-)
  • 是的,我知道第二个版本会导致双重删除,但是当我发布问题时,我认为 F() 是一个不同的函数,其中没有删除,这是我的错误。我解决了我的问题。
  • 这不会导致递归

标签: c++ arguments new-operator operator-keyword


【解决方案1】:

是的,它会释放内存,但在 C++11 之前,最好使用智能指针,例如 std::shared_ptrboost::shared_ptr。同样在您的示例中,最好将已释放指针设置为 NULL 以避免双重释放到 avoiding dangling pointer errors.

void F(A*& a)
{
    delete a; 
    a = NULL;
};

您将无法通过F(new A()); 调用它,并且需要将引用传递给持有变量的指针。就像在第二个变体中一样。那里应该有A* a = new A();,表示a是一个指针。

【讨论】:

  • 我正要写同样的,因此在你的答案中添加了一个链接..但可以使用void*
  • @KerrekSB 对,添加注释。
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多