【发布时间】:2013-09-04 18:40:56
【问题描述】:
我担心使用带有智能指针的不完整类型以及如何删除指针。下面的代码安全吗?我认为不会,因为 main.cpp 会生成 Farm 的默认析构函数,它不会看到完整的类型。为了安全起见,我认为我应该创建一个看到完整类型的非内联析构函数。对吗?
如果我在 Farm 中使用 std::vector<Cow> 也一样吗?
农场.h
class Cow;
struct Farm
{
Farm();
// ~Farm();
std::unique_ptr<Cow> cow;
};
农场.cpp
#include "cow.h"
// cow now complete
Farm::Farm()
{
cow.reset(new Cow);
}
// Farm::~Farm() {}
main.cpp
#include "farm.h"
int main()
{
Farm farm;
}
编辑:我尝试在没有析构函数的情况下使用 Visual Studio 进行编译,它显示错误 C2338:无法删除不完整的类型。我想这回答了我的问题。
【问题讨论】:
-
请注意,使用 auto_ptr,代码编译:-/
-
@Jarod:是的,而且默默地做错事。
-
@Jarod42: 使用
auto_ptr的代码很糟糕,因为Farm的默认析构函数使用auto_ptr的析构函数,它只对不完整类型delete执行Cow。如果Cow的实际析构函数不平凡,则它具有UB,否则有效。由于编译器无法分辨它是哪一个(没有Cow的定义),它继续输出代码。
标签: c++