【问题标题】:Placement operator new lookup放置运算符新查找
【发布时间】:2019-06-18 20:43:10
【问题描述】:

我是 C++ 新手,被下面的例子弄糊涂了:

#include <iostream>
#include <cstddef>
#include <cstdlib>

class Test{
public:
    enum test_type{ test1 = 0, test2, test3};
    void *operator new(size_t sz, test_type t){
        return malloc(sz);
    }
};

class SomeClass: public Test{
public:
    SomeClass(int a): a(a){}
    int a;
};

int main(int argc, char ** argv){
    SomeClass *sc = new(Test::test1) SomeClass(10);
    std::cout << sc->a << std::endl;
}

DEMO

我在cpp-reference page 中阅读了名称查找规则,但没有找到任何解释说明为什么找到基类中定义的运算符 new 并将其用于派生类(可能包含其他成员)。

在基类中声明operator new,然后使用它为派生类分配内存是一种常见的方法吗(这个想法来自一些用C++编写的开源项目)?

【问题讨论】:

  • 我建议不要乱用新的。只需将 std::unique_ptr 和 std::make_unique 用于堆对象
  • 一点也不常见,我是 C++ 的新手,因为我已经有一段时间了,我从来没有做过这样的事情。现在开始学习 c++,你很幸运,很长一段时间内你都不必直接使用new
  • @foreknownas_463035818 所以我认为应该避免使用带有新运算符的一些遗留代码。明白了,谢谢。
  • 我见过至少一个大型库 (Xerces) 会做这样的事情。它的所有类都派生自具有自定义operator new 的基类Memory。不是说这是一个的主意,只是我以前见过它。
  • 总旁注:你不应该使用&lt;cstddef&gt; &lt;cstdlib&gt;。 C++ 有一些功能更好的替代库,你也没有使用它们,所以你不需要包含它们。

标签: c++ new-operator name-lookup


【解决方案1】:

分配函数operator new 在正在创建的类的范围内“查找”,在本例中为SomeClass。当您在类的范围内查找名称时,它可以找到该名称作为基类的成员。这就是在这种情况下发生的情况。

也许您想知道为什么operator new 的查找不使用一些特殊规则将基类成员排除在考虑之外。好吧,我认为在某些情况下使用基类operator new 是有意义的。派生类可能包含其他成员这一事实本身并不会引起问题,因为该语言会将 派生 类的大小传递给operator new,以确保它知道多少它必须为派生类对象分配的内存。并且使用基类 operator new 允许从 CRTP 基类中引入所述运算符,或者只是为派生类从同一个池中分配提供一种方便的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多