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