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

  • 时间:
  • 浏览:1

};

}

底下的代码中,亲们 没人给class A手动写一一个多 析构函数,可能编译器自动生成的析构函数而是我亲们 要的:析构时把mImpl析构掉。

有一一个多 亲们 平常会遇到的场景,就会触发底下你你你你这个 现象。

void A::Func() {

// test.h

以下是由一一个多 文件组成的一一个多 工程,其中用到了'pImpl'土办法来隐藏实现,怎么让 在接口类放满了一一个多 std::auto_ptr,很简单:

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

class A {

现象清楚了:亲们 在编译main.cpp时,看必须A::Impl的完整版定义,但却有一一个多 自动生成的A::~A,其中delete了一一个多 不完整版的类对象!

// test.cpp

你你你你这个 析构函数的位置在哪呢?C++标准里说会把自动生成的类成员函数倒进类的定义中,没人而是我在test.h中。

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

public:

展开了基本而是我一句delete

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

A::~A() {}

这是可能在foo里,编译器看必须X的完整版类型,没土办法选者两件事情:

};

没人自动生成的析构函数长哪几个样子呢?大慨是:

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

答案是std::auto_ptr

class A::Impl {

public:

private:

手动写一一个多 A的析构函数,位置要在能就看A::Impl完整版定义的地方,也而是我test.cpp:

在不选者这两件事情的情况报告下,编译器必须按最普通的土办法去外理delete x

和前面说的warning信息完整版一致,看起来也是在调用delete时出的现象。但哪里调用了delete呢?