重载新值返回的值与

时间:2015-09-28 21:54:52

标签: c++ memory-management this new-operator

我在C ++代码中遇到了我认为奇怪的问题,并对原因感到好奇。我为类Object重载了新的并将返回的值打印到控制台。我还在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

1 个答案:

答案 0 :(得分:2)

new是一个原始分配器。所请求的地址和内存量的使用是实现定义的。

作为一个例子,调试信息,或关于块大小的信息(要销毁的对象的数量),或者(可能?Tricky,不确定数组如何工作)vtable信息都可以放在&#34; actual之前对象开始&#34;。

只保证在this之后通过原始位复制普通的可复制对象。

这意味着需要使用placement new的返回值,而不是重新解释指向原始存储的指针。