内存分配C++,加深记忆

大佬https://www.nowcoder.com/questionTerminal/0a584aa13f804f3ea72b442a065a7618
new/delete
1.new/new[], 首先底层调用malloc分配内存,然后调用构造函数创建对象-new在申请内存时会自动计算所需字节数
2.delete/delete[] 先调用析构函数清理资源,然后底层调用free释放空间
C++中,类的对象建立分为两种:

  • 静态建立(如A a)——其由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象,使用这种方法,直接调用类的构造函数。
  • 动态建立——使用new运算符将对象建立在栈空间中,这个过程分为两步-第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配。第二步是调用构造函数构造对象,初始化这片内存空间,这种方法,间接调用类的构造函数。
    只能在堆上建立对象
    即不能直接调用类的构造函数,不能将构造函数设为私有,因为C++提供new运算符的重载,其只允许重载 operator new函数,而operator函数用于分配内存,无法提供构造功能,因此,这种方法不可以。编译期在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查,如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存-因此,将析构函数设为私有,类对象就无法建立在栈上。
    只能在栈上建立对象
    重载了new就需要重载delete
    class A
    {
    private:
    void* operator new(size_t t){}
    void operator delete(void* ptr){}
    public:
    A(){}
    ~A(){}
    };

猜你喜欢

转载自blog.csdn.net/weixin_37625620/article/details/88872376
今日推荐