C++ C/C++;如何清理系统/stdlib调用分配的内存?

C++ C/C++;如何清理系统/stdlib调用分配的内存?,c++,c,memory-management,memory-leaks,C++,C,Memory Management,Memory Leaks,以这段代码为例: int main() { tm* now; time_t time_ = time(0); now = localtime(&time_); int y = now->tm_year + 1900; printf("%d\n", y); return 0; } 我们声明一个指向tm结构的指针,但不给它任何内存。然后,localtime()函数返回我们分配给局部变量“now”的tm结构的地址 我们是否负责删除

以这段代码为例:

int main() {

    tm* now;
    time_t time_ = time(0);
    now = localtime(&time_);

    int y = now->tm_year + 1900;

    printf("%d\n", y);

    return 0;
}
我们声明一个指向tm结构的指针,但不给它任何内存。然后,localtime()函数返回我们分配给局部变量“now”的tm结构的地址

我们是否负责删除/释放该内存,或者该内存是否以某种方式位于堆栈上

如果localtime()在堆栈上创建了内存,“now”指向的内存在localtime()返回后不会变得未定义(因此不可靠)吗?如果localtime()在堆上创建了内存,那么当我们完成它时,我们不需要清理内存吗

我错过了什么


谢谢。

它返回指向静态内部tm的指针,您无需进行清理

C++

C

来自
localtime
的Linux手册页:

返回值指向一个静态分配的结构,该结构可能被对任何日期和时间函数的后续调用所覆盖

因此,无论您调用localtime多少次,都不会出现内存泄漏



现在谈谈程序终止时内存是如何释放的。在您可能遇到的所有操作系统中(可能有一些晦涩或古老的系统,这是不正确的),当进程终止时,它的内存被释放。在具有虚拟内存的现代普通操作系统中,终止进程的内存空间基本上不存在(它如何映射到磁盘上的物理内存或交换文件对于用户空间程序来说是不可见的操作系统细节),因此整个分配没有任何剩余。

“返回值指向一个静态分配的结构,该结构可能被对任何日期和时间函数的后续调用所覆盖。”CRT具有全局状态、errno、stdin、stdout、strtok()是其他常见的例子。您自己不释放它。一些CRT实现使其成为线程本地状态,一些提供线程安全的替代方案,ymmv@engf-010空格通常位于逗号之后,而不是之前。