这个让我想到:
class X;
void foo(X* p)
{
delete p;
}
Run Code Online (Sandbox Code Playgroud)
delete p如果我们甚至不知道是否X有可见的析构函数,我们怎么可能呢?g ++ 4.5.1给出了三个警告:
Run Code Online (Sandbox Code Playgroud)warning: possible problem detected in invocation of delete operator: warning: 'p' has incomplete type warning: forward declaration of 'struct X'
然后它说:
注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete.
哇......像g ++一样诊断这种情况需要编译器吗?还是未定义的行为?
c++ pointers forward-declaration delete-operator incomplete-type
我担心使用带有智能指针的不完整类型以及如何删除指针.以下代码是否安全?我认为不会,因为main.cpp会生成Farm的默认析构函数,它不会看到完整的类型.为了安全起见,我想我应该创建一个非内联析构函数来查看完整类型.那是对的吗?
如果我std::vector<Cow>在农场使用它也是一样的吗?
farm.h
class Cow;
struct Farm
{
Farm();
// ~Farm();
std::unique_ptr<Cow> cow;
};
Run Code Online (Sandbox Code Playgroud)
farm.cpp
#include "cow.h"
// cow now complete
Farm::Farm()
{
cow.reset(new Cow);
}
// Farm::~Farm() {}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "farm.h"
int main()
{
Farm farm;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我尝试使用没有析构函数的Visual Studio进行编译,它说错误C2338:无法删除不完整的类型.我猜这回答了我的问题.