重载 new 返回的值与 this 不匹配
Value returned from overloading new and this do not match
我在我的 C++ 代码中遇到了我认为奇怪的地方,并且很好奇原因。我为 class 对象重载了 new 并将返回值打印到控制台。我还在 Object 的构造函数中打印了 this 的值。这些值不匹配(它们相差一个字)。这是预期的吗?
void* Object::operator new(size_t size)
{
void* startAddress = ...
std::cout << "object starts at absolute address " << (int)startAddress << "\n";
return startAddress;
}
Object(TypeId type)
{
_type = type;
std::cout << "this is address " << (int)this << "\n";
}
输出:
object starts at absolute address 5164888
this is address 5164896
new
是原始分配器。请求的地址和内存量的使用是实现定义的。
举个例子,调试信息,或者关于块大小的信息(要销毁的对象的数量),或者(也许?棘手,不确定数组如何工作)vtable 信息都可以放在 "actual object starts".
在 this
.
之后,只有普通的可复制对象才能保证通过原始位进行复制
这意味着需要使用放置 new
的 return 值,而不是重新解释的指向原始存储的指针。
我在我的 C++ 代码中遇到了我认为奇怪的地方,并且很好奇原因。我为 class 对象重载了 new 并将返回值打印到控制台。我还在 Object 的构造函数中打印了 this 的值。这些值不匹配(它们相差一个字)。这是预期的吗?
void* Object::operator new(size_t size)
{
void* startAddress = ...
std::cout << "object starts at absolute address " << (int)startAddress << "\n";
return startAddress;
}
Object(TypeId type)
{
_type = type;
std::cout << "this is address " << (int)this << "\n";
}
输出:
object starts at absolute address 5164888
this is address 5164896
new
是原始分配器。请求的地址和内存量的使用是实现定义的。
举个例子,调试信息,或者关于块大小的信息(要销毁的对象的数量),或者(也许?棘手,不确定数组如何工作)vtable 信息都可以放在 "actual object starts".
在 this
.
这意味着需要使用放置 new
的 return 值,而不是重新解释的指向原始存储的指针。