请考虑以下代码:
#include <iostream>
typedef int t;
t a=42;
int main()
{
a.t::~t();
std::cout << a; //42
}
Run Code Online (Sandbox Code Playgroud)
我预计a会被摧毁.但事实并非如此,为什么?伪析构函数调用将如何销毁该对象?
c++ destructor primitive-types language-lawyer explicit-destructor-call
C++ 标准是否允许在对象销毁之后但在释放之前使用对象提供的存储空间?
很明显,销毁常规对象后可以重用存储。但在下面的情况下,对象B为定义为模板参数的对象提供存储T,并在其自身构造期间在提供的存储中构造该对象。
此外,当对象被销毁时,提供的存储中的对象不会被销毁B,并且用于提供存储的数组的生命周期不会结束,因为它有一个没有效果的简单析构函数,这导致了一个问题:类型的对象A以或不结尾B。
#include <cstddef>
#include <iostream>
#include <memory>
#include <new>
struct A
{
int i = 23;
};
template<class T>
struct B
{
B()
{
// construct object T in the provided storage
new (&c) T;
}
// return a reference to the object in the provided storage
T & t()
{
return *std::launder(reinterpret_cast<T *>(&c));
}
// reserved storage
alignas(T) std::byte c[sizeof(T)];
};
int
main()
{ …Run Code Online (Sandbox Code Playgroud) 当我有一个函数时,让我们调用它foo()。在foo()我创建一个名为的对象obj1,它是ClassA. 另外,我将对象的引用复制到std::queue<ClassA&> qu.
我的问题是:返回obj1前对象是否已销毁foo()?
代码示例:
class ClassA {...};
std::queue<ClassA&> qu;
void foo()
{
ClassA obj1;
qu.push_back(obj1);
}
int main()
{
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)