看了野指针的概念后,想自己试一下,为什么没有出错呢?
int _tmain(int argc, _TCHAR* argv[])
{
        int* test1;
        test1 = new int;
        *test1 = 33;
        delete test1;
        *test1 = 23;
        return 0;
}*test1果然变成了23,并没有报错,我是在vs2005下调试运行的

解决方案 »

  1.   

    你那个不是野指针,
    int* test1;
    test1 = new int;
    你已经在堆上为它new(分配)了一个空间
      

  2.   

    可是我已经delete掉了,对应的空间已被free了,按道理说会报错的啊
      

  3.   

    虽然delete了,但是第二次赋值还是引用上次的地址
      

  4.   

    的确是有问题,野指针没清0真是危险,我试了楼主代码.把一个已经delete的指针赋值.
    然后再做其他new的动作,马上报错. int* test1;
    test1 = new int;
    *test1 = 23;
    delete test1;
    *test1 = 23;
    int* b = new int;User breakpoint call from code at 0x7c92120e
    7C92120B   ret         4
    7C92120E   int         3
    7C92120F   ret
    这里停住.看来误动作了delete的指针,还是会出问题的.
      

  5.   

    正因为不会报错才叫“野指针”啊。如果报错了也就不存在这个问题了。
    delete只是说那部分内存我不用了,但是指针仍然是指向那部分内存的,因此依然可以访问到。
      

  6.   

    觉得这个不报错的问题,可能跟编译器有关.又或者是刚好没有报错.
    之前试过,用Dev的编译器,一个完全没有new出来的指针,去delete也不报错的,只是后面会突然死机.
    但VC6就马上会报错.
      

  7.   

    可我看资料,说会报堆错误,“HEAP:   Free   Heap   block   xxxxxx   modified   at   xxxxxx   after   it   was   freed  ”,即修改free后的heap块,上面这种情况应该是符合的,为什么不报错?
      

  8.   

    在VC中delete之后的内存并不会马上交还给操作系统,所以有可能可以访问,如果这块内存没有做它用,可能不会出现问题,你用下面的代码再测试一下。
      int* test1;
      test1 = new int;
      *test1 = 33;
      delete test1;
      *test1 = 23;
      int *test2=new int;
      return 0;
      

  9.   


    /*
    一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,
    它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,
    要么将指针设置为NULL,要么让它指向合法的内存。 二、指针p被new或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
    但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。
    很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
    */void main()
    {
    //for example:
    char* p = new char[4]; //传说中的野指针
    char* pStr = "123";
    strcpy(p,pStr);
    delete p; //p又变成了传说中的野指针,且并非指向NULL
    if (NULL == p)
    strcpy(p,"PASS?");
    system("pause");
    }
      

  10.   

    delete 之后,空间被回收了,但是空间还在,所以可以访问,但是会出错,不报错,并不意味了,没有错,重新分配内存的时候,就会有问题
      

  11.   

    测试一下:
    int main()
    {
    int* test1;
        test1 = (int*)malloc(4);
    printf("%x\n",test1);
        *test1 = 33;
        free(test1);
    test1=NULL;
    if(test1==NULL)
    printf("delete\n");
    else
            *test1 = 23;
    printf("%x",test1);
        return 0;}
    加上test1=NULL.避免野指针。
      

  12.   

      test1 = new int;
      new的解释
    The new keyword allocates memory for an object or array of objects of type-name from the free store and returns a suitably typed, nonzero pointer to the object.
      new的作用是在堆上给test1分配一个空间,并且把空间地址给test1
      delete test1;
      delete的解释
      (The delete operator deallocates a block of memory. The cast-expression argument must be a pointer to a block of memory previously allocated for an object created with the new operator.
       delete的作用是解除new的内存分配,也就是将内存设置为非占用状态,指针本身并没有进行操作。  所以*test1 = 23只是将23的地址传递给test1
      我想楼主所说的会报错可能是如下两种情况
      1.出了test1的作用域以后使用test1
      2.delete以后又使用test1指向的内存空间(不一定报错)
      

  13.   

    引用 12 楼 lhcwjy 的回复:在VC中delete之后的内存并不会马上交还给操作系统,所以有可能可以访问,如果这块内存没有做它用,可能不会出现问题,你用下面的代码再测试一下。
    int* test1;
    test1 = new int;
    *test1 = 33;
    delete test1;
    *test1 = 23;
    int *test2=new int;
    return 0;
    没有错误,单步跟踪了下,分配空间也成功了
    就算delete的内存未给其他使用,写了后也会错的,而且是莫名其妙的错。
        int* test1;
        test1 = new int;
        *test1 = 23;
        delete test1;
        *test1 = 23;
        int* b = new int;
    最后一句 int* b = new int;时,之前test1的地址应该未有用到,但还是飞出一个错误来。
    有时没有出现错误,但当我关闭整个软件时,才报出错误。