【问题标题】:Compiler error when overriding operator new重写 operator new 时出现编译器错误
【发布时间】:2012-01-01 16:42:12
【问题描述】:

我不明白为什么在尝试编译时出现编译器错误:

void* MemoryManagedObject::operator new(size_t size, bool UseMemPool)
{
    Engine* engine = Engine::GetEngine();
    void* alloc;

    alloc = engine->GetMemoryManager()->Allocate(size, UseMemPool);

    if (alloc && UseMemPool)
        mAllocatedWithMemPool = true;

    return alloc;
}

它说“在静态成员函数中无效使用成员 MemoryManagedObject::mAllocatedWithMemPool”。

基本上,我有一个标志,表明在分配类实例时是使用内存池还是只使用 malloc(),并且我想在覆盖“new”时设置它。

我猜“新”方法必须返回才能使用类实例?有没有办法解决这个问题?

编辑:只是好奇,ss 这段代码也是一个有效的解决方案吗?

void* MemoryManagedObject::operator new(size_t size, bool UseMemPool)
{
    Engine* engine = Engine::GetEngine();
    MemoryManagedObject* alloc;

    alloc = (MemoryManagedObject*)engine->GetMemoryManager()->Allocate(size, UseMemPool);

    if (alloc && UseMemPool)
        alloc->mAllocatedWithMemPool = true;

    return alloc;
}

【问题讨论】:

  • 好吧,回答你的直接问题:你得到一个编译器错误,因为operator new 是一个静态函数。
  • 不是new方法必须返回,而是类实例必须存在。听起来你不想要一个 operator new 而是一个包装类。
  • 分配器应该分配内存,而不是构造任何对象。因此它应该返回一个void*,并且您不能拥有像alloc->mAllocatedWithMemPool 这样的访问权限。稍后将在您返回的内存上调用对象的构造函数。

标签: c++ memory-management operator-overloading malloc


【解决方案1】:

operator new()(和operator delete())的每个重载都被隐式自动声明为static。这是 C++ 中的一个特殊规则。

因此,您应该设计您的类,以便 构造函数 也可以记住它是如何分配的,如果您需要保留该信息:

Foo * p = new (true) Foo(true);

也就是说,你的班级应该是这样的:

class Foo
{
    bool mAllocatedWithMemPool;
public:
    static void * operator new(std::size_t n, bool usePool);
    static void operator delete(bool) throw();
    explicit Foo(bool usePool);
    /* ... */
};

请注意,您应该始终声明匹配的 delete 运算符,即使它的使用非常有限。

【讨论】:

    【解决方案2】:

    这个错误基本上告诉你不能在静态方法中使用你的类的成员。
    成员变量与保存它的实例(您的“this”指针)链接。 静态方法与您的类的实例无关(这使其成为“静态”。它属于 yoir 类的所有实例。)
    当您尝试在静态方法中使用成员变量时,编译器无法知道该成员变量属于您的类的哪个实例,因为该方法属于所有实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多