当前位置: 首页 > 知识库问答 >
问题:

当在C和C++中严格要求解分配内存时?

隆安然
2023-03-14

我在StackOverflow(内存分配/解分配?)中找到了以下与内存解分配有关的C和C++标准的引用:

C++语言:

“如果给标准库中的解分配函数的参数是一个不是空指针值(4.10)的指针,则解分配函数将解分配该指针所引用的存储,使所有指向解分配存储的任何部分的指针无效”。[黑体是我的]。

C语言:

free函数导致ptr指向的空间被释放,即使其可用于进一步分配。[黑体是我的]。

那么,让我们假设一个类似下面这样的场景:

>

  • 真正需要的内容(“如果不释放,则会因为...而导致内存泄漏);

    什么是好的做法,但不严格要求。

    最后:我有意避免提及智能指针。因为,如果您的回答是“释放它是一个很好的实践(=不是严格要求的,没有内存泄漏),因为在实际生活场景中您将需要释放,等等”,那么我可以得出结论:

    >

  • 如果我正在开发一个演示应用程序,我不需要使用智能指针(如果我使用C++)。

    如果我在C中,我不需要释放,因为当到达作用域的app端时,每个指针都将被删除。

    编辑:感谢您的快速回答。特别@巴勃罗·埃斯特万·卡马乔。

  • 共有1个答案

    巫马俊力
    2023-03-14

    这是一个需要两个答案的话题,因为C和C++在资源管理方面遵循完全不同的哲学。

    在C中使用malloc/free时,唯一受影响的资源是内存。这就引出了已经提出的其他答案:您可能会想在程序结束时不释放内存,因为操作系统无论如何都会回收进程的所有内存。因为我不是用C语言编程的,所以我不能说这是不是和什么时候是合理的。

    C++则不同。没有借口不破坏你的物品。C++将获取和释放内存与一般的初始化和清理联系起来。当您创建一个对象时,它的构造函数将运行,而当您销毁它时,它的析构函数将运行。对于堆栈分配的对象以及自由存储分配的对象(newdelete)都是如此。如果不删除,则析构函数也不会运行,这意味着关闭数据库或网络连接、将文件刷新到磁盘等基本操作可能不会发生。

    在C++中从不想到“内存管理”,总是想到“资源管理”。内存只是众多资源类型中的一种。

    话又说回来,在C++世界里,整个问题感觉有点奇怪。它甚至不应该出现,因为如果您遵循最佳实践,您将使用C++的自动资源管理:或者通过直接在堆栈上创建对象,或者通过使用资源管理包装器[1]。如果您发现自己正在编写一个裸露的new--希望是相应的delete--您应该像编写一个goto时一样有充分的正当理由。

    [1]智能指针std::unique_ptrstd::shared_ptr是明显的资源管理器。但是有很多,例如std::vector。当然,它做了更多的工作,但它的工作之一是处理存储向量项的堆内存。

     类似资料:
    • 本文向大家介绍C语言 动态内存分配详解,包括了C语言 动态内存分配详解的使用技巧和注意事项,需要的朋友参考一下 C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系

    • 本文向大家介绍C++动态内存分配(new/new[]和delete/delete[])详解,包括了C++动态内存分配(new/new[]和delete/delete[])详解的使用技巧和注意事项,需要的朋友参考一下 C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数mall

    • 我用C++创建了一个简单的类Storer,用于内存分配。它包含六个字段变量,所有这些变量都在构造函数中赋值: 我对这些变量是如何存储的很感兴趣,所以我编写了以下代码: 我对输出非常感兴趣:

    • 我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码: 我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包

    • 问题内容: 当您知道on上对象/项目的确切数量时,我非常想知道哪种内存分配方法对性能(例如,运行时间)有利,这对性能有好处。少量对象(少量内存)和大量对象(大量内存)的成本。 与 请告诉我。谢谢。 注意:我们可以对此进行基准测试,并且可能知道答案。但是我想知道解释这两种分配方法之间性能差异的概念。 问题答案: 静态分配将更快。静态分配可以在全局范围和堆栈上进行。 在全局范围内,静态分配的内存内置在

    • 本文向大家介绍浅谈C++ 类的实例中 内存分配详解,包括了浅谈C++ 类的实例中 内存分配详解的使用技巧和注意事项,需要的朋友参考一下 一个类,有成员变量:静态与非静态之分;而成员函数有三种:静态的、非静态的、虚的。 那么这些个东西在内存中到底是如何分配的呢? 以一个例子来说明:  这是我的一段测试代码, 运行结果是:    我有疑问如下: (1)C++中,应该是对象才会被分配内存空间吧??为什么