深入C++的new
作者:网络转载 发布时间:[ 2014/11/11 11:34:30 ] 推荐标签:C++ new 指针
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 //返回指针
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11