根据准则:
如果需要默认析构函数,但其生成已被抑制(例如,通过定义移动构造函数),则使用=default。
我无法想象在类中,如果没有显式默认析构函数,代码什么时候会出现错误,而类中有移动构造函数。
有人能给我举个例子证实上面的话吗?
struct S {
S() {};
S( S&& ) {}; // move ctor
};
int main() {
S s; // there is no need to declare dtor explicitly =default
}
假设我有:
class Base {
public:
virtual ~Base() = 0;
}
class Derived: public Base {
public:
~Derived();
}
在我的代码中,我需要通过一个Derived指针删除Base类,如下所示:
delete[] pt_base;
但是,在已实现的析构函数中,我实际上没有任何要销毁的东西。但我仍然需要他们通过基类删除?
在不浪费大量代码和空析构函数的情况下,实现我想要的东西的最佳方法是什么?
我的问题很简单,但我在任何地方都找不到问题。
如果我有一个这样的类
class A {
vector<int> data;
}
当A的实例被销毁时,data也会被销毁吗?或者我应该为A编写一个析构函数来调用data的析构函数吗?基本上我担心当A的实例被销毁时,向量的动态内存是否不会被释放。我怀疑答案是data被正确地释放了,但我不想以一种艰难的方式发现我错了。
此外,如果A是一个结构,当data的本地实例超出作用域时,会调用A的析构函数吗?
这是我在pimpl中使用unique_ptr时所看到的一个简化。我选择unique_ptr是因为我真的想让类拥有指针--我希望pimpl指针和类的生命周期是一样的。
无论如何,这是头文件:
#ifndef HELP
#define HELP 1
#include <memory>
class Help
{
public:
Help(int ii);
~Help() = default;
private:
class Impl;
std::unique_ptr<Impl> _M_impl;
};
#endif // HELP
以下是源代码:
假设我有一堂课
class A {
public: // I know, I know...
shared_ptr<string> aString;
};
我必须有一个破坏者像
~A() {
aString.reset();
}
以确保所有权得到适当的解除?我做了几次测试,而且似乎不需要--也就是说,当A的实例超出范围或被删除(或者重置,如果我通过shared_ptr引用它),字符串也会被删除(我使用了一个更复杂的示例来证实这一点)。但是,这可能是特定于我正在使用的编译器的实现(clang-700.0.72)。
我的问题是:这种情况总是这样吗,还是像删除任何其他哑指