C++ new函数的背后

2014-11-24 12:15:01 · 作者: · 浏览: 2

C++中,new操作主要是分为一下三个版本:[来自cplusplus.com]

\

首先,如果要求你new一个int,你会觉得 so easy。直接

int *p = new int(5);

int *p = new int;


new操作实际上执行了3个步骤: 在堆上分配一块内存,调用构造函数(对于简单类型,则省略了第二步),以及返回指针。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+vdPPwsDgo6y4tNTT0ru146OszqrPwsPmtcTA4G5ld9K7uPa21M/zo6w8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+Y2xhc3MgQTwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz57PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPnByaXZhdGU6IGludCBhOzwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz5wdWJsaWM6IEEoaW50IF9hKTphKF9hKSB7ICAgfTs8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+fTs8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+QSAqcGEgPSBuZXcgQTsgLy+07c7zo6xBsqLDu9PQxKzIz7m51Oy6r8r9o6jM4s3iu7DBy6Oho6k8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+QSAqcGEgPSBuZXcgQSgzKTsgINXi0ru+5M/gtbHT2ta00NDBy8/Cw+a1xMj90NC0+sLro7o8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PGJyPgo8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+QSAqcGEgPSAoQSopbWFsbG9jKHNpemVvZihBKSk7PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPnBhLT5BOjpBKDMpOzwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz5yZXR1cm4gcGE7PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPjxicj4KPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPrChxbajrNX9usPTodakwcvJz8PmtcTI/bj2sr3W6KGjPC9zdHJvbmc+PC9wPgo8cD48YnI+CjwvcD4KPHA+PHN0cm9uZz7U2sq1vMq1xNOm08OzzNDy1tCjrL2o0unKudPDbmV3stnX97f7o6w8L3N0cm9uZz48c3Ryb25nPtLyzqrJz8r2bWFsbG9jyOe5+7X308PKp7Dco6zKx7K7u+HX1LavtffTw8TatOa31sXkyqew3LXEuq/K/bXEPC9zdHJvbmc+PHN0cm9uZz6jrLWrysfI57n7yrnTw25ld7XEu7DKx7/J0tS1xKOsvajS6bLOv7wgU1RMv+K1xGFsbG9jv9W85MXk1sPG96OsvbK1xLrcz+rPuKGjPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPjxicj4KPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPsbktM46ILbU09rJz8r2tcTI/bj2bmV3uq/K/bXEyrnTw7e9t6ijrLTLtKbX9tK7uPa88rWltcSy4srUo6yx47/JvPvSu7Dfo7o8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PC9zdHJvbmc+PC9wPgoKPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+sOaxvjHT67Dmsb4y1rvKx9bY1Ni1xLnYz7WjrLbU09ogbm90aHJvd190IKOsxuTKtb7Nysex6te8v+LOqsHL1tjU2NXiuPa6r8r90v3I67XE0ru49rOjwb+jrLjDseTBv8rHuPZzdHJ1Y3SjrLao0uXOqiAgIHN0cnVjdCBub3Rocm93X3R7ICAgfTsgICAgveG5uczlzqq/1aGjPC9zdHJvbmc+PC9wPgo8cD48L3A+CjxwPjxzdHJvbmc+sOaxvjLU2sTatOa31sXkyqew3Lrzyseyu7vhxdez9tLss6O1xKOstvjKx9LUt7W72NK7uPZudWxs1rjV68C0tPrM5qGjPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPjxicj4KPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPrDmsb4zutzT0NLiy7yjrL32vfbWu8rHt7W72HB0crXEJiMyMDU0MDujrLK7u+G31sXkxNq05r/VvOSho8jnufvKudPD0ru49m5ld7LZ1/e3+7XEveG5+8C0tffTw7jDuq/K/aOsxMfDtL7Nz+C1sdPa1Nq4w8TatObJz9a00NC21NOmwODQzbXEubnU7Lqvyv0uPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPjxicj4KPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPsnPyva0+sLrtcTWtNDQveG5+6O6PC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/49/1_kktcw__.jpg" alt="">

可以很清楚的看到,new (pa2) A; 该行代码并没有分配空间,因为它的内存地址与pa2是完全一致的。

pa3只是分配内存,并没有创建构造函数,也就没有调用构造函数,输出了一个空行~~


Note:

STL库中的new与delete在底层都是通过malloc和free来实现的。区别就是,malloc不会自动调用内存分配失败函数。