关于C++指针方面的问题,请教一下大家

来源:百度知道 编辑:UC知道 时间:2024/06/06 07:02:41
下面的一段关于函数localtime()用法的代码,是我从网上查到的:
函数名: localtime
功 能: 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为日历时间
用 法: struct tm *localtime(const time_t *clock);
程序例:

#include "stdio.h"
#include "stddef.h"

int main(void)
{
time_t timer;
struct tm *tblock;

/* gets time of day */
timer = time(NULL);

/* converts date/time to a structure */
tblock = localtime(&timer);

printf("Local time is: %s", asctime(tblock));

return 0;
}

其中的指针: tblock,程序中并没有为其分配内存呀,它指向的是个未知区域吧.就算localtime函数为它返回一片内存,那么这片内存在什么地方释放掉呢?按照我的理解,这不是一个野指针吗?在网上查了好几处示例代码,都是这么写的.小弟才疏学浅,看不明白.请哪位高手指点一下:这么写是哪种C++语法现象?

回答者: zgjxwl - 参将 九级 2-28 15:54
的说法有错误, localtime所分配的内存是堆内存, 在手工释放之前是不受作用域限制的, 只是tblock在函数作用域外不再有效而已,

这片内存没有释放掉, 但是在win32下却不会造成内存泄漏, 原因在于,1.程序没有连续的分配内存, 2. main返回后,会由程序加载器 loader来释放掉所有被该进程占用的内存, 这不是C++语法, 但是你要明白, 你所编写的程序不只你看到的那么简单, 这方面, 你可以去看看windows核心编程。。

struct tm *tblock; 定义指针变量,分配内存。

tblock = localtime(&timer); 指针指向函数返回的内存区域。

野指针是只会在动态分配内存时产生,即用户自己动态使用分配的内存,即使用 malloc()\calloc()函数,和 new操作符分配的内存忘记释放时。

前者用用free()释放,后者用delete释放。忘记释放会产生野指针,导致运行错误!

不是由用户动态分配的内存,系统会自动释放,不用管它。

struct tm *tblock; //这不是定义吗,所以有内存分配
tblock = localtime(&timer); //用该函数的返回值赋给它,所以不是野指针

它是在main函数中定义的,所以具有函数作用域,main函数运行完即被释放

野指针,算指动态申请内存的时候,你忘记了删除,或者你删除了没有为NULL,别的地方可以继续用。这样知道为什么不算野指针了吧