现在的位置: 首页 > 综合 > 正文

C++程序崩溃的情况有哪些?

2013年09月22日 ⁄ 综合 ⁄ 共 1775字 ⁄ 字号 评论关闭
/*
goal, C++程序崩溃的情况有哪些?面试时被问到这个问题。我现在想到了下面一些情况,并
测试了一下。我想应该还有其他情况吧,有兴趣的同学可以留言补充。
date, 2013-3-10
env, ubuntu1204-gcc
blog, http://blog.csdn.net/shunqiziranhao007/article/details/8635196
*/
#include <iostream>
using std::cout; using std::endl;
#include <cstring>
#include <vector>
using std::vector;

class A
{
public:
	A() : a(0), b(new int(2)) {}
	~A() { delete b; }

	// 由于这个函数没有使用到类的数据成员,所以使用空指针时可以访问该函数
	void f1()
	{
		cout << "f1()" << endl;
	}

	void f2() 
	{
		cout << "f2()" << "a: " << a << ", b: " << *b << endl;
	}
private:
	int a;
	// 刚开始测试的时候没有加指针成员,有些情况没有崩溃,后来加了,就崩溃了。
	int *b;
};

void show(char *str)
{
	str[0] = 'x';
	cout << str << endl;
}

A* fun()
{
	A a;
	A *p = &a;
	return p;
}

int main()
{
#if 0
	// 使用空指针,但是访问的函数没有使用了类的数据成员,所以调用还是成功的。
	A *p = 0;
	p->f1();
#endif

#if 0
	// 使用空指针,但是访问的函数使用了类的数据成员,所以调用失败
	A *p = 0;
	p->f2();
#endif

#if 0
	// 使用未初始化的指针,测试没崩??
	A *p;
	p->f2();
#endif

#if 0
	// 使用了已经删除的指针,测试并没有崩溃??
	A *p = new A;
	p->f2();
	delete p;
	p->f1();
	p->f2();
#endif

#if 0
	// 多次删除同一个指针,没崩溃??我记得会崩溃的啊??
	A *p1 = new A;
	p1->f2();
	delete p1;
	delete p1;
#endif

#if 0
	// 使用数组时越界访问了,崩溃
	A* a = new A[2];
	for (int i = 0; i < 10; i++)
	{
		a[i].f2();
	}
	cout << endl;
#endif

#if 0
	// 使用c字符串时,没有注意字符串结束符,测试没有崩溃
	char a[] = {'1', '2', '2'};
	cout << strlen(a) << endl;
#endif

#if 0
	// 使用迭代器时,迭代器无效。崩溃
	vector<A> va;
	vector<A>::iterator it = va.begin();
	it->f2();
#endif

#if 0
	// 使用迭代器时,迭代器无效了。如该迭代器已经被删除了,已经不是以前那
	// 个迭代器了。崩溃了。
	A a;
	vector<A> va;
	va.push_back(a);
	vector<A>::iterator it = va.begin();
	while (it != va.end())
	{
		va.erase(it);
		++it;
	}
#endif

#if 0
	// 使用迭代器时,迭代器无效了。内存调整了,已经不是以前那个迭代器了;
	A a;
	vector<A> va;
	va.push_back(a);
	vector<A>::iterator it = va.begin();
	it->f2();
	va.resize(10);
	it->f2();
#endif

#if 0
	// 迭代器越界访问,崩溃
	A a;
	vector<A> va;
	va.push_back(a);
	vector<A>::iterator it = va.begin();
	it->f2();
	it = va.end();
	it->f2();
#endif

#if 0
	// 分配内存,让内存耗尽,没测试。
	A* a = new A[100000000000000];
#endif

#if 0
	// 修改了静态区内存的数据,测试崩溃了
	char *str = "crash";
	show(str);
#endif

#if 0
	// 返回局部变量的引用或者指向局部变量的指针,测试没有崩溃?
	A *ra = fun();
	ra->f2();
#endif

#if 0
	// 删除了非new分配的内存,测试崩溃了。
	int i;
	int *p = &i;
	delete p;
#endif

	return 0;
}

抱歉!评论已关闭.