Можно ли уничтожить объект раньше, чтобы его память использовалась последующими объектами?

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] Так что большинство людей предлагают использовать сферу, что является хорошим способом.
Мне все еще очень любопытно, могу ли я использовать там ~ a и ~ b?
Я думаю, что это кажется возможным и удобным способом тоже.

[Обновление 2] У меня возникла другая ситуация. В этой ситуации границы различных переменных переплетены! Это так: область действия a перекрывается с областью действия b, но они не включают отношения. Это частичное совпадение отношений.
В этом случае означает ли это, что использование области невозможно?
И последнее средство — использовать новое и удалить, верно?

0

Решение

Используйте размещение 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

3

Другие решения

Вы можете разбить его на более мелкие функции:

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);
);

Если вы делаете что-то настолько сложное, что ни один из них не подходит, вы можете возиться с объединением или новым размещением; детали будут сложными, в зависимости от ваших странных требований.

2

Вы можете контролировать время жизни объектов в стеке с помощью фигурных скобок.

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 раньше был.

1

Как ваш фрагмент кода, вы можете написать как

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
1
По вопросам рекламы [email protected]