C++:delete不完整类型的指针

  • 时间:
  • 浏览:0
  • 来源:彩神3D_神彩3D官方

这是导致 着在foo里,编译器看只能X的删剪类型,没措施 选取两件事情:

private:

A::A(): mImpl(new Impl) {}

A::~A() {}

public:

以下代码编译一定会有warning:

class A {

越来越自动生成的析构函数长什么样子呢?合适 是:

class A::Impl {

public:

展开了基本要是 一句delete

手动写有四个A的析构函数,位置要在能就看A::Impl删剪定义的地方,也要是 test.cpp:

有有四个许多人平常会遇到的场景,就会触发后面 这些难题。

};

在GCC4.1.2下,编译出错信息是:

void A::Func() {

// test.cpp

和前面说的warning信息删剪一致,看起来也是在调用delete时出的难题。但哪里调用了delete呢?

后面 的代码中,许多人越来越给class A手动写有四个析构函数,导致 着编译器自动生成的析构函数要是 许多人要的:析构时把mImpl析构掉。

难题清楚了:许多人在编译main.cpp时,看只能A::Impl的删剪定义,但却有有四个自动生成的A::~A,其中delete了有四个不删剪的类对象!

答案是std::auto_ptr

在不选取这两件事情的情況下,编译器只能按最普通的措施 去除理delete x

这些析构函数的位置在哪呢?C++标准里说会把自动生成的类成员函数中放类的定义中,越来越要是 在test.h中。

};

}

// test.h

以下是由有四个文件组成的有四个工程,其中用到了'pImpl'措施 来隐藏实现,要是 在接口类中放了有四个std::auto_ptr,很简单:

看起来很正常,但编译时有warning: