荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]我想从void *转换,为什么必须使用换型?
发信站: 荔园晨风BBS站 (Sun Jun 13 12:16:37 2004), 站内信件


Q: 我想从void *转换,为什么必须使用换型符?
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) { /* ... */ }




--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店