在C++类中出现野指针大概率是浅拷贝的问题
/*
1.浅拷贝的意思是类中成员有部分是在对上申请的空间赋值, 然后当直接用一个对象对另一个对象赋值的时候, 如果没有重载运算符或者重写拷贝构造函数, 那么就会按照位复制的方法, 那么此时类中的成员指向的是同一块内存空间,如果其中一个类被释放, 调用了析构函数, 那么另一个类指向了一片被释放的空间, 此时如果这个类也被释放了, 那么系统就会提示二次释放, 此时这个类中的成员就是野指针
2. 函数返回值出现的野指针, 如果我们在函数内部想返回局部空间, 此时被接受的也是野指针, 野指针的作用非常的恐怖如下例子
*/
#include <stdio.h>
class CTestClass
{
public:
CTestClass( void );
int m_nInteger;
void Function( void );
};
CTestClass::CTestClass( void )
{
m_nInteger = 0;
}
void CTestClass::Function( void )
{
printf( "This is a test function.\n" );
}
int main( void )
{
CTestClass* p = new CTestClass;
delete p;
p->Function();
return 0;
}
/*
平常我们释放完指针以为就安全了, 其实并没有, 他还是指向了那片内存空间, 还是能调用类中的方法函数, 虽然他的作用不大, 但是他调用了并不属于自己的控件
解决方式是在每次释放空间以后把指向这一片空间的指针全部指向NULL
*/
腾讯笔试题目
#include 'stdafx.h'
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class Test
{
public:
Test()
{
a = 9;
delete this;
}
~Test()
{
cout<<'destructor called!'<<endl;
}
int a;
};
int _tmain(int argc, _TCHAR* argv[])
{
Test *mytest = new Test(); //mytest的值和this指针的值是一样一样的
cout<<mytest->a<<endl;
return 0;
}
/*
运行的时候并不会报错, 编译也是正常输出,只不过输出的值是垃圾值
*/