深入C++的new

发表于:2014-11-11 10:02

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:闵开慧    来源:51Testing软件测试网采编

  1. New的本质
  当使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:
  ① 获得一块内存空间
  ② 调用类构造函数
  ③ 返回指向地址的正确指针
  如果创建的是简单类型的变量,第二步就不执行了。下面我们看一段代码:
1 #include <iostream>
2
3
4 class A {
5     int m_value;
6 public:
7     A(int value) :m_value(value * value){}
8     void Func(){
9         std::cout<< m_value;
10     }
11 };
12
13 int main()
14 {
15     A *aPtr = new A(1);
16     delete *aPtr;
17     system("pause");
18     return 0;
19 }
  在调用 “A *a = new A(1);” 时,其过程大致如下:
  1     A *aPtr = (A*)malloc(sizeof(A)); // 分配内存区域
  2     aPtr->A::A(1);                   // 调用对象构造函数
  3     return aPtr;                     // 返回内存地址指针
  上面三句话表面上看起来是得到了aPtr这个指向内存的指针。但是它与new自身的区别在于,当malloc失败的时候,上面的代码不会调用分配内存失败处理程序new_handler。而使用new的话就会。因此,我们要尽可能的使用new,避免一些不必要的麻烦。
  下面是 “A *a = new A(1);” 的汇编码(windows 7, Visual Studio 2008):
1     A *aPtr = new A(1);
2 0116140D  push        4
3 0116140F  call        operator new (1161190h)   //使用new分配内存空间
4 01161414  add         esp,4
5 01161417  mov         dword ptr [ebp-0ECh],eax
6 0116141D  mov         dword ptr [ebp-4],0
7 01161424  cmp         dword ptr [ebp-0ECh],0
8 0116142B  je          main+72h (1161442h)
9 0116142D  push        1
10 0116142F  mov         ecx,dword ptr [ebp-0ECh]
11 01161435  call        A::A (1161019h)         //调用构造函数进行初始化
12 0116143A  mov         dword ptr [ebp-100h],eax
13 01161440  jmp         main+7Ch (116144Ch)
14 01161442  mov         dword ptr [ebp-100h],0
15 0116144C  mov         eax,dword ptr [ebp-100h]
16 01161452  mov         dword ptr [ebp-0F8h],eax
17 01161458  mov         dword ptr [ebp-4],0FFFFFFFFh
18 0116145F  mov         ecx,dword ptr [ebp-0F8h]
19 01161465  mov         dword ptr [ebp-14h],ecx     //返回指针
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号