关于c++中new语句的使用方法~~

2024-12-05 06:26:38
推荐回答(5个)
回答1:

new有三种使用方式:plain new,nothrow new和placement new。

(1)plain new顾名思义就是普通的new,就是我们惯常使用的new。在C++中是这样定义的:
void* operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();

提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返回值是否为NULL是徒劳的。
(2)nothrow new是不抛出异常的运算符new的形式。nothrow new在失败时,返回NULL。定义如下:
void * operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
(3)placement new意即“放置”,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:
void* operator new(size_t,void*);
void operator delete(void*,void*);

提示1:palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。

提示2:placement new构造起来的对象或其数组,要显示的调用他们的析构函数来销毁,千万不要使用delete。

char* p = new(nothrow) char[100];
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];

回答2:

可以的,new int[5] 和new int [5]没有区别的! 这个不是属于语法的东西,属于个人编程习惯和格式,看个人的习惯吧!

回答3:

3: int *p=new int [10];
004010E8 6A 28 push 28h//内存的大小10*4
004010EA E8 21 00 00 00 call operator new (00401110)
004010EF 83 C4 04 add esp,4

00401110 55 push ebp
00401111 8B EC mov ebp,esp
00401113 51 push ecx
00401114 6A 01 push 1//_nh_malloc参数2
00401116 8B 45 08 mov eax,dword ptr [cb]
00401119 50 push eax//_nh_malloc参数1
0040111A E8 E1 3B 00 00 call _nh_malloc (00404d00)//调用_nh_malloc申请内存
0040111F 83 C4 08 add esp,8
00401122 89 45 FC mov dword ptr [res],eax//把_nh_malloc的返回值给[res]
00401125 8B 45 FC mov eax,dword ptr [res]//返回申请内存的指针
00401128 8B E5 mov esp,ebp
0040112A 5D pop ebp
0040112B C3 ret//返回

调用过程可以看成这样:
new[4*10]->_nh_malloc(40, 1)->返回申请的指针

res这个是VC6.0反汇编后给出的变量名,其实它是一个局部变量
push ecx //这句就是申请res的内存的 相当sub esp, 4

00401122 89 45 FC mov dword ptr [res],eax//把_nh_malloc的返回值给[res]
00401125 8B 45 FC mov eax,dword ptr [res]//返回申请内存的指针
为什么会产生产生上面的2句代码?
因为这个是调试模式的编译,代码没有优化,所以才会产生这样的问题
等于
>

回答4:

double typename = new double

回答5:

写程序就是要不断尝试,试一试就清楚了,别嫌麻烦