【发布时间】: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;
}
我在cpp-reference page 中阅读了名称查找规则,但没有找到任何解释说明为什么找到基类中定义的运算符 new 并将其用于派生类(可能包含其他成员)。
在基类中声明operator new,然后使用它为派生类分配内存是一种常见的方法吗(这个想法来自一些用C++编写的开源项目)?
【问题讨论】:
-
我建议不要乱用新的。只需将 std::unique_ptr 和 std::make_unique 用于堆对象
-
一点也不常见,我是 C++ 的新手,因为我已经有一段时间了,我从来没有做过这样的事情。现在开始学习 c++,你很幸运,很长一段时间内你都不必直接使用
new -
@foreknownas_463035818 所以我认为应该避免使用带有新运算符的一些遗留代码。明白了,谢谢。
-
我见过至少一个大型库 (Xerces) 会做这样的事情。它的所有类都派生自具有自定义
operator new的基类Memory。不是说这是一个好的主意,只是我以前见过它。 -
总旁注:你不应该使用
<cstddef>和<cstdlib>。 C++ 有一些功能更好的替代库,你也没有使用它们,所以你不需要包含它们。
标签: c++ new-operator name-lookup