0

这是我的标题代码:

#ifndef CLANDTYPES_H
#define CLANDTYPES_H

class CLandTypes
{
public:
    CLandTypes();
    ~CLandTypes();
private:
    class Pimple;
    static Pimple * d;
};

#endif // CLANDTYPES_H

因为它应该是我尝试在我的 cpp 文件中编码的静态类:

#include "clandtypes.h"

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();
...

但有些不对劲!

- - - - - 编辑 - - - - -

这是我的扩展 C++ 代码:

#include "clandtypes.h"

#include "qvector.h"
#include "qpair.h"

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();

class CLandTypes::Pimple
{
public:
    Pimple();
    ~Pimple();

    QVector > LandTypes;
};

CLandTypes::Pimple::Pimple()
    : LandTypes(NULL)
{
    LandTypes.push_back(qMakePair((unsigned int) 0, (QString)"undefined"));
    LandTypes.push_back(qMakePair((unsigned int) 1, (QString)"rocky"));
}

CLandTypes::Pimple::~Pimple(){}

CLandTypes::CLandTypes()
{
    if (!d)
    {
       d = new Pimple();
       if (!d)
       {
           throw std::bad_alloc();
       }
    }
}

CLandTypes::~CLandTypes()
{
    if(d)
    {
        delete d;
        d = NULL;
    }
}

我的两个错误是:

'struct CLandTypes::Pimple' 的不完整类型'struct CLandTypes::Pimple'
前向声明的无效使用

4

2 回答 2

1

移动这一行:

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();

在类定义之后CLandTypes::Pimple

它反对您尝试使用它new来创建它一无所知的类的实例。

如果这样做,请删除检查构造函数定义中是否 d 是否为nullptr(aka ) 的代码。此代码可能导致内存泄漏。此外,在调用后再次检查然后抛出是完全没有必要的,因为定义为抛出分配失败。!dCLandTypes::CLandTypesnew::std::bad_allocnew::std::bad_alloc

可能发生内存泄漏的方式是,如果在初始化的静态初始化程序运行之前运行构造函数CLandTypes::dCLandTypes只有在其他地方的静态初始化程序中使用构造函数时才会发生这种情况。将发生的情况是构造函数将给一个值d,然后静态初始化器d将在稍后运行并覆盖该值,从而导致内存泄漏。

于 2011-04-25T11:18:06.140 回答
0

尝试将“类 Pimple”声明为公共而不是私有,并尝试让我知道这是否有帮助。确保在实例化之前定义类。

于 2011-04-25T10:29:34.127 回答