gpt4 book ai didi

c++ - 是否可以更早地销毁对象,使其存储内存被后续对象重用?

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:55 25 4
gpt4 key购买 nike

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] 所以大部分人建议使用scope,这是一个很好的方式。我还是很好奇,我可以在那里使用 ~a 和 ~b 吗?我认为这似乎也是一种可行且方便的方式。

[更新 2] 我想出了另一种情况。在这种情况下,不同变量的范围是交织在一起的!是这样的:a的作用域和b的作用域有重叠,但不包括关系。它是部分重叠的关系。在这种情况下,这是否意味着无法使用范围?而最后的手段就是用new和delete对吧?

最佳答案

使用 placement 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

我建议阅读有关 operator new 的优秀资源:http://en.cppreference.com/w/cpp/language/new

关于c++ - 是否可以更早地销毁对象,使其存储内存被后续对象重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com