C ++: можно ли уничтожить объект раньше, чтобы его память использовалась последующими объектами?
В одном сегменте кода C ++ в первой половине используются объекты a, b;
во второй половине части объекты c, d создаются и используются.
Поскольку объекты a, b занимают много памяти, я хочу уничтожить объекты a, b вручную, когда закончится 1-я половина.
Я знаю, что могу использовать новое, удалить, чтобы добиться этого.
Но если я не использую новый и все еще хочу уничтожать объекты раньше (это означает, что до момента его окончания области действия), могу ли я вручную вызвать его деструктор, чтобы уничтожить его? Так что эта часть памяти может быть повторно использована для объектов 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 = ...;
[Обновление 1] Так что большинство людей предлагают использовать сферу, что является хорошим способом.Используйте размещение new и вызовите деструкторы вручную:
{
char memory[std::max(sizeof(A),sizeof(B))];
A* pA = new (memory) A();
// use `pA`
pA->~A(); // destruct A
B* pB = new (memory) B();
// use `pB`
pB->~B(); // destruct B
} // `memory` goes out of scope
Рекомендую почитать этот отличный ресурс по новому оператору: http://en.cppreference.com/w/cpp/language/new
Вы можете разбить его на более мелкие функции:
void part1() {
monsterClass a, b;
a = monsterClass(1000, 2000);
b = monsterClass(2000, 3000);
processMethod1(a, b);
}
или блоки в большей функции
{
monsterClass a, b;
// and so on
}
{
dragonClass c, d;
// and so on
}
или использовать временные
processMethod1(
monsterClass(1000, 2000);
monsterClass(2000, 3000);
);
Если вы делаете что-то настолько сложное, что ни один из них не подходит, вы можете возиться с объединением или новым размещением; детали будут сложными, в зависимости от ваших странных требований.
Вы можете контролировать время жизни объектов в стеке с помощью фигурных скобок.
void foo()
{
int x = 5;
int y = 2;
{ // This introduces a new scope
int z = 3;
} // After this brace, z is now out of scope
int a = x + y;
}
Но учтите, что как только переменная выходит из области видимости, при повторном использовании этой памяти не указывается. Просто потому, что я объявил другой int
названный a
, не означает, что ему будет назначен адрес, на котором z
раньше был.
Как ваш фрагмент кода, вы можете написать как
int i,j,k,l;
{
monsterClass a(1000, 2000);
monsterClass b(2000, 3000);
i = processMethod1(a, b);
j = ...;
k = ...;
l = ...;
}
// here, you want to destroy a, b, since they are not used any more, while occupy memory.
dragonClass c(400, 3000);
dragonClass d(500, 4000);
processMethod2(c, d, i);
j = ...;
k = ...;
l = ...;
// you could use the same technique if there are still e, f or so