如何在我指向的安德烈斯上动态分配内存?

How to dynamically allocate memory on andress whom I point to?

本文关键字:动态分配 内存 安德烈      更新时间:2023-10-16

Hell'o 我想创建自己的动态数组(矢量)类,但不知道如何在我指向的地址上分配内存。在函数中添加中,我添加了如下行:int * object = new (this->beginning + this->lenght) int (paramValue);但是Visual Studio向我显示一条错误消息"无法使用给定的参数调用运算符new"。如何使其工作,我应该将哪些参数发送给运算符?

(我不确定是否理解你的问题,但是...

您可能希望使用放置 new 运算符(但要实现类似<vector>的东西,您不需要它)。然后你需要#include <new>

但你可能不需要它。只需从构造函数调用纯new,从析构函数调用纯delete。类似于int*arr = new int[length];(在构造函数中)和后来的delete[] arr;(在析构函数中)。

(看来你误解了什么;我建议花几天时间阅读一本好的C++编程书)

如何在我指向的地址上分配内存

信息不足 -- 什么样的系统?定制硬件?操作系统?


在桌面上,您可以使用 2 个步骤。 您可以使用如下方式分配字节块:

uint8_t* myMemoryBlock = new uint8_t[1000];  // 1000 byte block

然后,您可能会考虑使用"myMemoryBlock"在"您指向"的地址处使用放置新位置,并带有强制转换。

在桌面上,动态内存系统可以这样使用...

但是,如果您打算以任何方式创建用户定义类型,只需新该类型,并让动态内存落在它可能的位置,而不是将其放置在myMemoryBlock上。

在桌面上,(通常)没有您的用户权限级别可执行文件可以使用"new"访问的内存。 所有其他内存都受到保护。

Linux 上的 mmap 将设备或文件映射到可执行文件的内存范围内。 我不熟悉此类设备,但我已将mmap与文件一起使用。


更新 2017/03/19

注 1 - 通常阻止用户权限级别任务访问其他/特殊内存。

注2 - 内存地址,例如上面的"myMemoryBlock",是虚拟的,而不是物理的。 这包括代码地址、自动内存地址、动态内存地址。 如果您的处理器具有内存管理硬件支持,则您的编码需要特别努力来访问内存中的物理地址或其他方式。


在单板计算机(SBC)上(有或没有操作系统),我希望您希望"分配"的地址不在板级支持包(BSP)设置的"动态"内存中。

在这种嵌入式系统(在SBC上),有人(架构师)已将此"特殊"存储器"映射"到不用于其他目的的地址范围(即不是动态存储器的一部分)。 在这里,您只需找出地址是什么,并通过将 uintXX_t 值强制转换为适当类型的指针来使用它。 像这样:

myDataType* p = reinterpret_cast<myDataType*>(premappedAddress);

有关更多信息,您应该寻找其他讨论嵌入式系统的网站。