重载New调用自动构造对象
C++: Overloaded New call constructs object automatically
我试图重载new操作符,以便分配我自己的内存,但我仍然需要构造对象。这就是为什么我决定通过可变模板传递参数,以便正确地提供对象的构造函数。
在这个例子中构造函数被调用了两次,我无法解释为什么。似乎重载的new会自动调用构造函数。
#include <stdlib.h>
#include <iostream>
#include <new>
class A
{
public:
template<typename... Args>
void *operator new(size_t sz, Args ...parameters)
{
void *mem = ::operator new(sizeof(A));
A *var = ::new (mem) A(parameters...);
return var;
}
A() : num(0) { std::cout << "Default" << std::endl; }
A(int nb) : num(nb) { std::cout << "Integer = " << num << std::endl; }
const int num;
};
int main()
{
A *obj = new A(3);
std::cout << "Obj result = " << obj->num << std::endl;
}
修复,没有理由尝试在重载中调用构造函数,对象将在返回的void*的指定分配内存中构造。
我试图重载new操作符,以便分配我自己的内存,但我仍然需要构造对象。
不,你没有。operator new
根据定义初始化对象。参见[expr.new]/15:
创建类型为的对象的new-expression T初始化该对象如下:—如果省略new-initializer,则对象为default-initialized (8.5);如果未进行初始化,则对象的值不确定。
—否则,新初始化式将根据8.5的直接初始化规则。
您的重载至少可以像这样:
void *operator new(size_t sz)
{
return ::operator new(sizeof(A));
}
static
关键字可选
相关文章:
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 如何在不使用new的情况下保持在其他对象中创建的对象存活?
- 为什么销毁被放置 new 覆盖的对象不是未定义的行为?
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 如何影响由 new 和强制转换为数组 od 类对象的内存?
- 双指针在使用 new 时不调用对象构造函数
- 使用 new in C++(在 Windows 上)分配大于 2GB 的单个对象
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- 从主函数中删除在另一个函数中使用 new 创建的一系列对象
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- 函数是否应返回"new"对象
- 为什么我的对象似乎在不使用new”的情况下在堆上
- 使用放置 new 覆盖内存中的对象
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 显式调用"运算符 new"后无法访问对象的函数
- 如何使用 new 和 delete 与 OpenGL 的缓冲区对象一起使用?
- 了解C++中的动态对象("new")