相关疑难解决方法(0)

删除不完整类型的对象

这个让我想到:

class X;

void foo(X* p)
{
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

delete p如果我们甚至不知道是否X有可见的析构函数,我们怎么可能呢?g ++ 4.5.1给出了三个警告:

warning: possible problem detected in invocation of delete operator:
warning: 'p' has incomplete type
warning: forward declaration of 'struct X'
Run Code Online (Sandbox Code Playgroud)

然后它说:

注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete.

哇......像g ++一样诊断这种情况需要编译器吗?还是未定义的行为?

c++ pointers forward-declaration delete-operator incomplete-type

25
推荐指数
2
解决办法
1万
查看次数

如何使用智能指针安全地破坏类到不完整的对象类型?

我担心使用带有智能指针的不完整类型以及如何删除指针.以下代码是否安全?我认为不会,因为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:无法删除不完整的类型.我猜这回答了我的问题.

c++

7
推荐指数
1
解决办法
2793
查看次数