/* 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; }