【问题标题】:Do dynamic structs need to be deleted if given value from a function?如果从函数中给定值,是否需要删除动态结构?
【发布时间】:2021-11-12 07:42:07
【问题描述】:

对不起,如果这个问题难以理解,但我不知道如何措辞。

比如说我有一个像下面这样的结构,

struct Days {
       int counter;
};

我主要有

Days *d = new Days;
d.counter = 0;

如果我然后在 main 内部这样的循环中使用 d

do {
   int num = rand()%900+1000;
   d = add(d, num);
} while(user decides to continue}
delete d;

其中函数add如下

Days *add(Days *d, int num) {
      Days *temp2 = new Days;
      temp2.counter = 0;
      if (d.counter > 0)
          temp2.counter = d.counter;
      temp2.counter += num;
      return temp2;
]

自从复制结束后,我是否需要在 do-while 循环的每次迭代后删除 d? 如果是这样,会不会在if statement中的add函数中像这样

if (d.counter > 0) {
    temp2.counter = d.counter;
    delete d;
}

或者它会在主循环中吗?

【问题讨论】:

  • 您不能像那样访问d.counter,您需要先取消引用指针(*d.counterd->counter)。要回答你,你newed,你必须自己delete它,如果你不这样做,你的程序会泄漏内存,无论new是否在函数内部(所以是的,你需要在某个时候删除您在每次迭代中分配的内容)。最后,我不知道你为什么在这里使用指针?根本不需要它们,因为无论如何您都想要一份副本。
  • @Fareanor 对不起,我整天都在使用“。”来处理一个项目。和 '->' 所以我本能地使用了 '.' if 语句中的释放是否足够?
  • 换一种观点:我看不出有任何理由在这里使用new。这是一个要求吗?在堆栈上分配Days 并在需要时通过引用传递它会简单得多。
  • @churill 我的教授很擅长只使用你需要的东西,但他只是通过使用new 向我们展示了动态分配。我听说过malloc 和其他方法,但我没有过多了解它们。
  • @odo 不,不是,你是newed temp2,而不是d,所以你应该delete 正确的那个。但是如果你在函数内部删除它,你就不能再使用返回的值了。最后,根本无法检查计数器的值来测试是否需要删除,这是没有意义的。

标签: c++ struct memory-management


【解决方案1】:

其实你不需要自己分配任何东西。

在主函数中,只需将变量声明为:

// Create a Days object with counter initialized to zero
Days d {0};

然后,您可以像这样定义 add 函数:

void add(Days & d, int num)
{
    d.counter += num;
}

或者如果你真的想使用指针而不是引用:

void add(Days * d, int num)
{
    d->counter += num;
}

最后,你可以这样称呼它:

do
{
    int num = whatever();
    add(d, num);
    // add(&d, num); if you used the pointer version
}
while(condition);

如果我可以给你一个建议,因为 add() 应该对 Days 对象进行操作,因此将其设为 Days 的成员函数可能是有意义的,这样你就不需要传递Days 作为参数并摆脱指针/引用的东西^^

在这种情况下,

add(d, num);

会变成:

d.add(num);

【讨论】:

  • 抱歉回复晚了,非常感谢!我的程序的另一部分有一些 UB,在修复它之后,我想确保做这样的事情不会创建它的另一个实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多