A: 在C中,你可以隐式转换,但这是不安全的,例如:
#include<stdio.h>
int main()
{
char i = 0;
char j = 0;
char* p = &i;
void* q = p;
int* pp = q; /* unsafe, legal C, not C++ */
printf("%d %d\n",i,j);
*pp = -1; /* overwrite memory starting at &i */
printf("%d %d\n",i,j);
}
如果你使用T*类型的指针,该指针却不指向T类型的对象,后果可能是灾难性的;所以在C++中如果你要将void*换型为T*,你必须使用显式换型:
int* pp = (int*)q;
或者,更好的是,使用新的换型符,以使换型操作更为醒目:
int* pp = static_cast<int*>(q);
当然,最好的还是——不要换型。
在C中一类最常见的不安全换型发生在将malloc()分配而来的内存赋给某个指针之时,例如:
int* p = malloc(sizeof(int));
在C++中,应该使用类型安全的new操作符:
int* p = new int;
而且,new还有附带的好处:
- new不会“偶然”地分配错误大小的内存
- new自动检查内存是否已枯竭
- new支持初始化
例如:
typedef std::complex<double> cmplx;
/* C style: */
cmplx* p = (cmplx*)malloc(sizeof(int)); /* error: wrong size */
/* forgot to test for p==0 */
if (*p == 7) { /* ... */ } /* oops: forgot to initialize *p */
// C++ style:
cmplx* q = new cmplx(1,2); // will throw bad_alloc if memory is exhausted
if (*q == 7) { /* ... */ }
本文乃网上搜集得来,其版权归原作者和原出处所有。如有侵犯版权之处请与我联系,我将马上进行处理。