【发布时间】:2015-02-03 22:10:06
【问题描述】:
C++:能否提前销毁对象,让后续对象重用其存储内存?
在一段 C++ 代码中,在前半部分,使用了对象 a、b; 在后半部分,创建和使用对象 c、d。
由于对象 a、b 占用大量内存,我想在前半部分完成时手动销毁对象 a、b。
我知道我可以使用new,delete来实现它。
但是如果我不使用 new,并且仍然想更早地销毁对象(也就是说,在其范围结束之前),我可以手动调用它的析构函数来销毁它吗?这样那部分内存就可以被对象 c 和 d 重用。 (我不需要释放内存,因为可以重用。
这是一个伪代码:
monsterClass a, b;
dragonClass c, d;
int i,j,k,l;
a = monsterClass(1000, 2000);
b = monsterClass(2000, 3000);
i = processMethod1(a, b);
j = ...;
k = ...;
l = ...;
// here, I want to destroy a, b, since they are not used any more, while occupy memory.
// The above half part and the below half part use many common variables.
// So it seems scope {} method makes it inconvenient,
// since I don't want to create a function with too many parameters.
// I don't want to use new or delete here. I hope it looks simple and not prone to error
// So can I use: ~a, ~b here?
c = dragonClass(400, 3000);
d = dragonClass(500, 4000);
processMethod2(c, d, i);
j = ...;
k = ...;
l = ...;
[Update 1] 所以大多数人建议使用范围,这是一个好方法。 我还是很好奇,我可以在那里使用 ~a 和 ~b 吗? 我认为这似乎也是一种可行且方便的方式。
[更新 2] 我想出了另一种情况。在这种情况下,不同变量的作用域是交织在一起的!就像这样:a 的范围与 b 的范围有重叠,但它们不包括关系。它是部分重叠的关系。 在这种情况下,这是否意味着无法使用范围? 最后的手段是使用new和delete,对吧?
【问题讨论】:
-
请添加代码示例来解释为什么必须在对象在其范围结束之前销毁对象。您可以随时添加额外的
{}来定义更小的范围。 -
You can manually call the destructor of the original object, and then use placement
newto create a new object on top of that memory。如果您这样做,请清楚地记录事情,因为它可能会严重混淆/误导代码的读者。 -
你能把这两部分实现为单独的函数吗?或者在一个函数中单独的块?这将比手动控制简单得多(尽管在某种程度上这是可能的,如果你真的需要的话)。
-
在开始使用新放置之前,请检查您的类如何处理内存。他们是否在内部分配内存(例如在构造函数中使用 new)?他们自己占据大面积,还是他们的成员占据?
-
@timrau, Mike Seymour, 上半部分和下半部分使用了许多公共变量。所以看起来 scope {} 方法很不方便,因为我不想创建一个参数太多的函数。