42得票2回答
为什么需要在 std::move 之后调用析构函数?

在C++编程语言第四版中,有一个向量实现的示例,在消息末尾查看相关代码。 uninitialized_move()通过将它们从旧内存区域移动到新内存区域来初始化新的T对象。然后它在原始T对象上调用析构函数,即移动自对象。为什么在这种情况下需要调用析构函数? 这是我的不完全理解:移动对象意味...

28得票3回答
为什么可以显式调用析构函数,而不能显式调用构造函数?

在下面的C++代码中,我被允许显式调用析构函数,但不能调用构造函数。为什么呢?显式调用构造函数难道不更具表现力和与析构函数相统一吗? 在下面的C ++代码中,我可以显式地调用析构函数,但不能调用构造函数。为什么呢?难道显式调用构造函数会更具表现力并且与析构函数的情况相统一吗?class X ...

24得票3回答
在对象显式销毁但内存未被释放之前调用成员函数是否合法?

我有这段代码:struct data { void doNothing() {} }; int main() { data* ptr = new data(); ptr->~data(); ptr->doNothing(); ::operato...

24得票4回答
显式调用析构函数。

我偶然发现了以下代码片段:#include <iostream> #include <string> using namespace std; class First { string *s; public: First() { s = new ...

22得票2回答
在具有固定生命周期的变量上显式调用析构函数并使用placement new的方式是否允许?

我知道显式调用析构函数可能会导致未定义的行为,因为会出现双重析构调用,就像这样:#include <vector> int main() { std::vector<int> foo(10); foo.~vector<int>(); retur...

17得票1回答
伪析构函数调用不会销毁对象。

请看下面的代码: 考虑以下代码: #include <iostream> typedef int t; t a=42; int main() { a.t::~t(); std::cout << a; //42 } 我原本以为a会被销毁。但事实...

14得票4回答
我们需要显式调用使用“placement new”分配的“简单POD类”的析构函数吗?

这里的“简单”是指一个具有非虚空析构函数或POD类型的类。 典型示例: char buffer[SIZE]; T *p = new(buffer) T; ... p->~T(); // <---- always ? 如果我们不调用p的显式析构函数会发生什么?我认为这不是未...

10得票3回答
我可以使用函数指针调用虚析构函数吗?

我有一个名为Data的类,它可以保存指向对象的指针。我想以后能够手动调用其析构函数,因此需要将其地址存储在变量中,但似乎禁止获取构造函数/析构函数的地址。是否有任何解决方法? struct Data { union { long i; float f; void...

7得票1回答
在C++中,缩短`constexpr`对象的生命周期是否合法?

对于普通对象(即使是const对象),通过显式调用析构函数来结束它们的生命周期是允许的。之后,程序可以使用放置new在相同的内存位置开始另一个对象生命周期。 但是调用constexpr对象的析构函数是否合法?它是否会导致一些有用或至少良好构造的程序? 很容易想象相反的情况: struct...