24.new的作用-灵析社区

菜鸟码转

1.new 的简介:

new 是 C++ 中的关键字,尝试分配和初始化指定或占位符类型的对象或对象数组,并返回指向对象 (或数组的初始对象) 的指针。

  • 用 new 创建对象时,首先从堆中申请相应的内存空间,然后调用对象的构造函数,最后返回指向对象的指针。new 操作符从自由存储区(free store)上为对象动态分配内存空间,而 malloc 函数从堆上动态分配内存。自由存储区是 C++ 基于 new 操作符的一个抽象概念,凡是通过 new 操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C 语言使用 malloc 从堆上分配内存,使用 free 释放已分配的对应内存。new 可以指定在内存地址空间创建对象,用法如下:

C++

new (place_address) type

place_address 为一个指针,代表一块内存的地址。当使用上面这种仅以一个地址调用 new 操作符时,new 操作符调用特殊的 operator new:

C++

void * operator new (size_t, void *) 

对于指定的地址的 new 对象,在释放时,不能直接调用 delete, 应该先调用对象的析构函数,然后再对内存进行释放。比如以下程序:

C++

include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    char buf[100];
    int *p=new (buf) int(101);
    cout<<*(int*)buf<<endl;
    return 0;
}
  • new 可以用来动态生成对象数组,但此时 new 生成的数组,只能用 delete 来释放。

C++

int *arr = new int [100];
  • 在 cpp 中由于 new 作为操作符可以进行重载,所以可以对 new 进行重载,比如可以指定构造函数对对象进行初始化。对 new 操作符可以进行全局重载和局部重载,全局重载后,所有调用 new 的操作都会被重写;局部重载就是在类中重写 operator new 函数,但只会对该类生效,即该类执行 new 操作时会生效。

C++

#include <iostream>

class Test {
private:
    int value;

public:
    Test() {
        printf("[Test] Constructor\n");
    }

    void* operator new(size_t size) {
        printf("[Test] operator new\n");
        return NULL;
    }
};

int main() 
{ 
    Test* t = new Test();
    return 0;
}

// [Test] operator new
// [Test] Constructor


阅读量:2010

点赞量:0

收藏量:0