2016.9.13

1 设p是指针变量,语句p=NULL等价于?

p=0;'\0'的ASCII码为0,所以NULL等效于0。

2

myClass::foo()
{
	delete this;
}
...
void func()
{
	myClass* a = new myClass();
	a->foo();
}
分析该代码:在类的成员函数中是可以调用delete this的。假设这个成员函数名字叫做release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数。
根本原因在于delete操作符的功能和类对象的内存模型。 当一个类对象声明时,系统会为其分配内存空间。在类对象的内存空间中,只有数据成员和虚函数表指针,并不包含代码内容,类的成员函数单独放在代码段中。在调用成员函数时,隐含传递一个this指针,让成员函数知道当前是哪个对象在调用它。当调用delete this时,类对象的内存空间被释放。在delete this之后进行的其他任何函数调用,只要不涉及到this指针的内容,都能够正常运行。一旦涉及到this指针,如操作数据成员,调用虚函数等,就会出现不可预期的问题。为什么是不可预期的问题?delete this之后不是释放了类对象的内存空间了么,那么这段内存应该已经还给系统,不再属于这个进程。照这个逻辑来看,应该发生指针错误,无访问权限之类的系统崩溃的问题才对啊?这个问题牵涉到OS的内存管理策略。 delete this释放了类对象的内存空间,但是内存空间却并不是马上被回收到系统中,可能是缓冲或者其他什么原因,导致这段内存空间暂时并没有被系统收回。此时这段内在是可以访问的,当你获取数据成员,可能得到的是一串很长的未初始化的随机数;访问虚函数表,指针无效的可能性非常高,造成系统崩溃。

在类的析构函数中调用delete this之后,会导致堆栈溢出。原因是delete的本质是“为将被释放的内存调用一个或多个析构函数,然后,释放内存”,显然,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢出,系统崩溃。

出处:http://blog.sina.com.cn/s/blog_4b4cf2af0100ywgv.html

3

char str[] = "http:www.renren.com"
char* p = str;
sizeof(str) = ?
sizeof(p) = ?
void foo(char str[100])
{
	sizeof(str) = ?
}
void* p = malloc(100);
sizeof(p) = ?
第一问为22,因为字符串所占空间大小就是字符串长度+1(1个结束符的长度)。补充:char c[10] = {'x', 'y', 'z'}, d[] = {'x', 'y', 'z'};则sizeof(c) = 10, sizeof(d) = 3,原因是不以'\0'作为结束标志的,它就没有串结束标志,字符数组的长度,就是数组的长度。
第二问为4,指针所指向的是地址,32位系统下地址长度为4字节。
第三问为4,函数传递时,数组会退化为指针。
第四问为4,原因与第二问一样。

4

#include <iostream>
using namespace std;

class Base
{
public:
	virtual int foo(int x){return x * 10;}
	int foo(char x[14]){return sizeof(x) + 10;}
};

class Derived: public Base
{
	int foo(int x){return x * 20;}
	virtual int foo(char x[10]){return sizeof(x) + 20;}
};

int main()
{
	Derived stDerived;
	Base* pstBase = & stDerived;
	char x[10];
	printf("%d\n", pstBase->foo(100) + pstBase->foo(x));
	
	return 0;
}
输出的是2014。对于pstBase->foo(100)来说,因为基类的foo(int x)是虚函数,因此会调用派生类的该重载函数,得到2000;对于pstBase->foo(x)来说,因为pstBase本质上是基类类型的指针,因此对于非虚函数,它会优先调用基类的成员函数,而不会去派生类中寻找。此时,x作为函数参数传递,将退化为指针,故sizeof(x)为4。

5

#include<stdio.h>
int main()
{
	unsigned char i = 7;
	int j = 0;
	for(; i > 0; i -= 3)
		++j;
	printf("%d\n", j);
	return 0;
}
输出的是173。因为unsigned char是8位数据位,其范围是0-255。i从7开始,循环3次后变成1。此时1再减3变成-2,由于是无符号char型,故-2会溢出,-2的原码为(1000 0010),则反码为(1111 1101),补码为(1111 1110),由于是无符号数,故其值变成254。又开始循环85次,变成-1。-1的原码(1000 0001),反码(1111 1110),补码(1111 1111),即为255,又循环85次,得i=0,退出循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值