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

内存分配/解除分配?[关闭]

滕学义
2023-03-14
char* x; 
x = (char*) malloc (8);

共有1个答案

柳业
2023-03-14

C++标准有一个内存模型。它试图以通用的方式对计算机系统中的内存进行建模。标准定义字节是存储器模型中的存储单元,存储器由字节组成(§1.7):

C++内存模型中的基本存储单元是字节。[...]C++程序可用的内存由一个或多个连续字节序列组成。

标准总是提供一个对象模型。这指定一个对象是一个存储区域(因此它由字节组成并驻留在内存中)(§1.8):

void* operator new(std::size_t);
void* operator new[](std::size_t);

这些如何实施不是标准所关心的问题。重要的是,它们应该返回一个指向某个存储区域的指针,其字节数与所传递的参数对应(§3.7.4.1):

分配函数尝试分配请求的存储量。如果成功,它将返回存储块的起始地址,该存储块的字节长度至少与请求的大小一样大。从分配函数返回时,对分配存储的内容没有约束。

它还定义了两个相应的解分配函数:

void operator delete(void*);
void operator delete[](void*);

通常,您不需要直接使用分配和解除分配函数,因为它们只给您未初始化的内存。相反,在C++中,您应该使用newdelete来动态分配对象。一个新表达式通过使用上面的分配函数之一来获得所请求类型的存储,然后以某种方式初始化该对象。例如,new int()将为int对象分配空间,然后将其初始化为0。参见§5.3.4:

一个新表达式通过调用一个分配函数(3.7.4.1)来获得对象的存储。

[...]

如果delete-expression的操作数的值不是空指针值,则delete-expression将调用一个解分配函数(3.7.4.2)。

然而,这些并不是分配或释放存储的唯一方式。该语言的许多构造隐含地要求存储分配。例如,给出一个对象定义,如int a;,也需要存储(§7):

定义导致保留适当数量的存储并进行任何适当的初始化(8.5)。

void*malloc(size_t size);
说明
malloc函数为一个对象分配空间,该对象的大小由size指定,其值不确定。
返回
malloc函数返回一个空指针或一个指向所分配空间的指针。

以及免费的定义(C99§7.20.3.2):

void free(void*ptr);
说明
free函数可使ptr指向的空间被释放,即可供进一步分配。如果ptr是空指针,则不发生任何操作。否则,如果参数与callocmallocrealloc函数先前返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则该行为未定义。

但是,在C++中使用mallocfree从来没有一个好的借口。如前所述,C++有自己的替代方案。

所以直接回答你的问题:

>

  • 正在分配的“内存”在哪里?

    分配内存使某些存储区域可供程序使用。对象在分配的内存中初始化。你只需要知道你可以分配内存。实际分配给进程的物理内存往往由操作系统来完成。

    当内存被释放时会发生什么?

    释放一些先前分配的内存会导致该内存对程序不可用。它就变成了释放存储。

    char* x; 
    x = (char*) malloc (8);
    

  •  类似资料:
    • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 如果我声明字符串数组,比如,

    • 问题内容: 这是一篇受此评论启发的帖子,内容涉及如何在CPython中为对象分配内存。最初,这是在创建列表并将其添加到for循环中_以_ 实现列表理解的上下文中。 所以这是我的问题: CPython中有多少个不同的分配器? 每个功能是什么? 什么时候被正式称为?(根据此评论中的内容,列表理解可能不会导致调用, python在启动时会为其分配多少内存? 是否有规则来控制哪些数据结构在此存储器上首先获

    • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理

    • 我开发了kervel驱动程序,并与dell进行了通信。尝试做一个快照功能和行走功能 我的结构是 在我的快照函数中,我这样做。 在walk函数中,我执行以下操作 当我在我的驱动程序条目中(当驱动程序加载时)使用这个函数时,所有的工作都很好。但当我从dll中调用它时,只有2秒钟的时间“Word Fine”,然后我就会出现蓝屏。 当我尝试从SM_MSI结构中删除Name变量时,所有工作都很完美。!!所以

    • 我正在尝试使用我的GPU而不是CPU来训练一个自定义的对象检测模型。我遵循了以下教程中给出的所有说明:https://tensorflow-object-detection-api-tutorial.readthedocs.io/ 我已经测试了我的软件,一切都已安装并正常工作。 目前正在使用: Windows 10 但问题是,在训练几秒钟后,它停止使用GPU,并发出以下警告消息。 此外,我没有在我

    • 我想知道何时或是否必须删除此对象。下面是一个基本类对象Object.cpp的构造函数: 我知道在分配内存时,你应该在某个时候删除它,但是我在构造函数中分配了内存,并且想再次使用变量1和2,我什么时候删除它们?