重载全局 operator new(非 POD)
Overloading global operator new (non-POD)
考虑以下示例:
void * operator new(size_t size)
{
void * p = malloc(size);
//Error handling supressed...
return p;
}
void operator delete(void * p)
{
free(p);
}
class foo
{
public:
foo() { baz = 4234; }
int baz;
};
class bar
{
public:
bar() { np = new foo(); }
~bar() { delete np; }
foo* np = nullptr;
};
int main(int argc, char* argv[])
{
bar * a = new bar();
printf("%d\n", (*a).np->baz);
delete a;
return 0;
}
我不明白为什么这样做。在这种情况下如何调用构造函数? class id POD(普通旧数据)都没有,它们都有构造函数和析构函数! static_assert
授予我 foo
或 bar
不是 POD,所以...
为什么printf
在控制台输出值4234
?怎么了?这不应该给我一些意想不到的东西吗?我正在使用 visual studio 15 编译器。
根据[class.ctor]/8,默认构造函数被调用来创建 class 动态存储持续时间的对象,该对象由省略了新初始化器的新表达式创建(无论是否默认 operator new
或用户定义 operator new
).
如果您不为 class 提供任何构造函数,编译器将始终将默认构造函数声明为内联 public 成员。
如果隐式声明的默认构造函数未定义为已删除,则 it 被定义为.
因此在这种情况下,为 foo
和 bar
调用了默认构造函数。
考虑以下示例:
void * operator new(size_t size)
{
void * p = malloc(size);
//Error handling supressed...
return p;
}
void operator delete(void * p)
{
free(p);
}
class foo
{
public:
foo() { baz = 4234; }
int baz;
};
class bar
{
public:
bar() { np = new foo(); }
~bar() { delete np; }
foo* np = nullptr;
};
int main(int argc, char* argv[])
{
bar * a = new bar();
printf("%d\n", (*a).np->baz);
delete a;
return 0;
}
我不明白为什么这样做。在这种情况下如何调用构造函数? class id POD(普通旧数据)都没有,它们都有构造函数和析构函数! static_assert
授予我 foo
或 bar
不是 POD,所以...
为什么printf
在控制台输出值4234
?怎么了?这不应该给我一些意想不到的东西吗?我正在使用 visual studio 15 编译器。
根据[class.ctor]/8,默认构造函数被调用来创建 class 动态存储持续时间的对象,该对象由省略了新初始化器的新表达式创建(无论是否默认 operator new
或用户定义 operator new
).
如果您不为 class 提供任何构造函数,编译器将始终将默认构造函数声明为内联 public 成员。 如果隐式声明的默认构造函数未定义为已删除,则 it 被定义为.
因此在这种情况下,为 foo
和 bar
调用了默认构造函数。