指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针,事实上free或delete只是把指针所指的内存给释放掉,但是指针的值还是这块内存的地址,只不过这块内存已经被回收了不能被该进程再使用,下面的例子就是一个典型的使用野指针的案例。 建议:free或delete之后将相应的指针设置为NULL 在创建指针变量p时...
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。 比如: (1)int * ptr; //指针所指向的类型是int (2)char * ptr; //指针所指向的的类型是char (3)int * * ptr; //指针所指向的的类型是int*(指针的指针,俗称二级指针) (4)int( * ptr )[...
可以看到在测试函数里,我们定义了一个指针变量,但是,这里需要注意的是,这个指针变量并没有delete操作,紧接着,我们来编写main函数,代码如下所示: 代码语言:javascript 复制 intmain(int argc,char**argv){int i;for(i=0;i<2;i++)test_func();return0;} 这样的程序存在一个什么隐患呢?如果在main函数中的i...
(2)Malloc和free在C程序中使用,而C++程序中使用new和delete,删除数组delete[]p,指针释放后,要将指针置空。 (3)New和delete可以调用构造函数和析构函数。 (4)Malloc是函数,new是关键字。 (5)Malloc不能赋初值,new可以,如int *p = new int(2).代表分配一个int型的内存空间,并赋初值2.如果new int ()代表...
voidnoLeak(){int*p=newint(42);// 用完了记得deletedeletep;p=nullptr;// 删除后最好置空} 1. 2. 3. 4. 5. 6. 更好的办法是直接用智能指针,这就相当于给厕所装了个自动冲水装置: 复制 #include<memory>voidmodern(){auto p=std::make_unique<int>(42);// 函数结束会自动释放内存,不用操心} ...
所有指针在声明时没有默认值且不会被初始化成NULL指针,其缺省值是随机的,因此,指针变量在声明的同时必须初始化,要么将其置NULL,要么将其指向合法内存。否则编译器会报错“‘point’ may be uninitializedin the function ”。 指针释放后之后未置空 指针在free或delete后未置 NULL,free和delete只是把指针所指的内存...
delete p;//该语句出错,应该删除或者注释 return 0; } 也就是说对指针变量P使用了两次delete,而且p所指向的并不是NULL,是一个new出来的具体的有效的地址,因此,在上述环境中编译不会提示错误,而运行时候出现错误。如果项目足够大,找这种错误会让你非常头疼。