Rock姜 2022-09-01 14:31 采纳率: 60%
浏览 104
已结题

C++ return (void*)(this+1)到底什么意思?

void* allocate() const {
return (void*)(this + 1);
}
这个函数的返回值,可以转换成一切类型的对象。可以说可以直接分配任何类型对象的内存。但是我对这个this+1确实不理解,我在往上查到this+1指向当前对象的最后一个内存地址,但是他怎么就替代了new了?这样分配内存的对象,是属于栈还是属于堆?

完整代码:

class A {
public:
  void pp() {
    cout<<"A"<<endl;
  }
}
class B {
public:
  void pp() {
    cout<<"A"<<endl;
  }
}
class Heap {
public:
  void* allocate() const {
    return (void*)(this + 1);
  }
}
int main() {
  Heap h;
  A* a = (A*)h->allocate();
  a.pp();

  B* b = (B*)h->allocate();
  b.pp();
}
  • 写回答

6条回答 默认 最新

  • qfl_sdu 2022-09-01 14:53
    关注

    allocate()是Heap的成员函数,this是Heap实例的指针,这个指针指向堆还是栈根据它的实例是怎么创建的的来决定的(new出来的实例指针就在堆上,Heap t;这样直接声明的变量,则再栈上)。this指向该Heap实例的内存地址,this+1指向了该实例地址的下一个地址,因为allocate()得到的这个地址不是通过new或者变量申请得到的,它指向的内存块容易被别的变量占用。void *是无类型指针,可以强制转换成任何类型的指针。

    你下面的代码,语法错误不少,先不管代码语法的问题,先说代码的理解。
    Heap h;声明了一个Heap变量,h位于栈上,所以,再allocate()的时候,this就位于栈上。h.allocate()返回的是栈空间上h实例后的地址。
    A* a = (A*)h.allocate()这一句也就相当于,声明了一个A类型的指针a,然后让a指向了h实例后的栈内存,所以,这段代码的实际作用就是:
    将h实例后的栈内存分配给了一个变量(暂时称呼它为t),void类型没有类型指向性,所以allocate()返回的实际就是h实例后的内存首地址,然后通过(A *)进行强制转换,也就相当于把h实例后的sizeof(A)大小的栈空间分配给了变量t,最后,让a指向了这个变量。所以,后面的a->pp()就相当于:
    A t;
    t.pp();
    同理,下面的b也是一样的。因为这块内存是栈上的,随时可以被回收和分配给其它变量。allocate()的作用仅仅是在给变量分配空间的时候,把变量的空间强制限定在了紧跟h实例后面的内存块上。这在内存空间受限的应用开发中是有价值的。

    下面是修改后的代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    class A {
    public:
        void pp() {
            cout << "A" << endl;
        }
    };
    class B {
    public:
        void pp() {
            cout << "B" << endl;
        }
    };
    class Heap {
    public:
        void* allocate() const {
            return (void*)(this + 1);
        }
    };
    int main() {
        Heap h;
        A* a = (A*)h.allocate();
        a->pp();
    
        B* b = (B*)h.allocate();
        b->pp();
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 已采纳回答 9月2日
  • 创建了问题 9月1日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效