C++中new一个对象

C++中new一个对象

对象很难找吗?new几个不就好了吗?

C++语言中,当我们new一个对象时候,背后做了哪些事情呢?

new operator 和operator new

1
string *str = new string("welcome here");

上面这句代码我们使用了new操作符,创建了一个string类型对象,这个new操作符就是new operator ,它做这两件事情:

  1. 分配一块内存
  2. 调用一个构造函数,设定对象初值。

new operator一定会做这两件事情,而operator new就是其中一项——分配内存。

函数operator new通常声明如下,它接收一个内存size,返回分配的内存地址,这是一块原始的,没有被初始化的内存。

1
void* operator new(size_t size)

operator new唯一做的事情就是分配内存。

1
2
3
4
5
6
7
8
9
10
class NewDemo {
public:
int num;
};

int main()
{
NewDemo demo;
printf("size: %d \n", sizeof(demo));
}

输出:

size: 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class NewDemo {
public:
void* operator new(size_t size) {
printf("开始分配内存\n");
void *p = ::operator new(size);
printf("p addr: %p \n", p);
return p;
}
NewDemo() {
printf("开始构造\n");
}
string str;
};

int main()
{
NewDemo *demo = new NewDemo();
printf("demo addr: %p \n",demo);
}

结果:

开始分配内存

p addr: 0000024F6C563310

开始构造

demo addr: 0000024F6C563310

可以看到最终对象对应的指针demooperator new中的分配出来的那块内存是对应同一块内存。

placement new

经过上面内容的讲解,我们知道在通过new关键字创建一个对象时候,会先分配内存,再针对这块内存做对象初始化。

可以考虑下,如果我们已经有了一内存,需要在这个上面构建对象,可不可以做到这一点。

实际上,placement new就允许这么干.placement new是一种特殊的operator new,它声明的方式是下面这样的,需要传入一个void*入参,指向一块内存。

1
void* operator new(size_t, void *location)

结语

这篇文章,希望读者使用new关键字构建一个对象时候,要清楚这背后发生了什么事情,并不是要学会placement new这种几乎不会用到操作。

另外与new相反的操作delete,同样对应一个operator delete来释放内存。



关注博客或微信搜索公众号多媒体与图形,获取更多内容,欢迎在公众号留言交流!
扫一扫关注公众号
作者

占航

发布于

2022-10-15

更新于

2023-10-04

许可协议

评论