如何在我指向的andress上动态分配内存?
How to dynamically allocate memory on andress whom I point to?
你好
我想创建自己的动态数组(向量)class,但不知道如何在我指向的地址上分配内存。在函数添加中,我添加了如下行:
int * object = new (this->beginning + this->lenght) int (paramValue);
但是 visual studio 显示错误消息 "operator new cannot be called with the given arguments"。如何让它工作,我应该将哪些参数发送给 new 运算符?
(我不确定你的问题,但是....)
您可能想使用 placement new 运算符(但要实现 <vector>
之类的东西您不需要它)。然后你需要 #include <new>
但您可能不需要它。只需从您的构造函数中调用 plain new
,并从您的析构函数中调用 plain delete
。类似于 int*arr = new int[length];
(在构造函数中)和后来的 delete[] arr;
(在析构函数中)。
(看来你误会了什么;我建议花几天时间读一本好书C++ programming)
how to allocate memory on address whom I point to
信息不足 -- 什么样的系统?定制硬件? OS?
在桌面上,您可以使用 2 个步骤。您使用类似以下内容分配一个字节块:
uint8_t* myMemoryBlock = new uint8_t[1000]; // 1000 byte block
然后您可能会考虑使用 'myMemoryBlock' 在地址 "you point to" 处使用 placement new,并进行强制转换。
在桌面上,动态内存系统可以这样使用...
但是,如果您打算以任何方式创建用户定义的类型,只需新建该类型,并让动态内存位于它可能的位置,而不是将其定位在 myMemoryBlock 上。
在桌面上,(通常)没有您的用户权限级别可执行文件可以使用 'new' 访问的内存。所有其他内存都受到保护。
mmap on Linux 将设备或文件映射到您的可执行文件内存范围。我对这些设备不熟悉,但是我对文件使用过mmap。
更新 2017/03/19
注 1 - 用户权限级别的任务通常被阻止访问其他/特殊内存。
注 2 - 内存地址,如上面的 'myMemoryBlock',是虚拟的,而不是物理的。这包括代码地址、自动内存地址、动态内存地址。如果您的处理器有内存管理硬件支持,您的代码会特别努力访问内存或其他地方的物理地址。
在单板计算机 (SBC) 上(带或不带 OS)我希望您希望 'allocate' 的地址不在 'dynamic' 内存由板级支持包 (BSP) 设置。
在这种嵌入式系统(在 SBC 上)上,某人(架构师)将 'mapped' 这个 'special' 内存分配到一个地址范围,该地址范围未用于其他目的(即不属于动态记忆)。在这里,您只需找出地址是什么,然后通过将 uintXX_t 值转换为适当类型的指针来使用它。类似于:
myDataType* p = reinterpret_cast<myDataType*>(premappedAddress);
有关详细信息,您应该查找其他讨论嵌入式系统的站点。
你好
我想创建自己的动态数组(向量)class,但不知道如何在我指向的地址上分配内存。在函数添加中,我添加了如下行:
int * object = new (this->beginning + this->lenght) int (paramValue);
但是 visual studio 显示错误消息 "operator new cannot be called with the given arguments"。如何让它工作,我应该将哪些参数发送给 new 运算符?
(我不确定你的问题,但是....)
您可能想使用 placement new 运算符(但要实现 <vector>
之类的东西您不需要它)。然后你需要 #include <new>
但您可能不需要它。只需从您的构造函数中调用 plain new
,并从您的析构函数中调用 plain delete
。类似于 int*arr = new int[length];
(在构造函数中)和后来的 delete[] arr;
(在析构函数中)。
(看来你误会了什么;我建议花几天时间读一本好书C++ programming)
how to allocate memory on address whom I point to
信息不足 -- 什么样的系统?定制硬件? OS?
在桌面上,您可以使用 2 个步骤。您使用类似以下内容分配一个字节块:
uint8_t* myMemoryBlock = new uint8_t[1000]; // 1000 byte block
然后您可能会考虑使用 'myMemoryBlock' 在地址 "you point to" 处使用 placement new,并进行强制转换。
在桌面上,动态内存系统可以这样使用...
但是,如果您打算以任何方式创建用户定义的类型,只需新建该类型,并让动态内存位于它可能的位置,而不是将其定位在 myMemoryBlock 上。
在桌面上,(通常)没有您的用户权限级别可执行文件可以使用 'new' 访问的内存。所有其他内存都受到保护。
mmap on Linux 将设备或文件映射到您的可执行文件内存范围。我对这些设备不熟悉,但是我对文件使用过mmap。
更新 2017/03/19
注 1 - 用户权限级别的任务通常被阻止访问其他/特殊内存。
注 2 - 内存地址,如上面的 'myMemoryBlock',是虚拟的,而不是物理的。这包括代码地址、自动内存地址、动态内存地址。如果您的处理器有内存管理硬件支持,您的代码会特别努力访问内存或其他地方的物理地址。
在单板计算机 (SBC) 上(带或不带 OS)我希望您希望 'allocate' 的地址不在 'dynamic' 内存由板级支持包 (BSP) 设置。
在这种嵌入式系统(在 SBC 上)上,某人(架构师)将 'mapped' 这个 'special' 内存分配到一个地址范围,该地址范围未用于其他目的(即不属于动态记忆)。在这里,您只需找出地址是什么,然后通过将 uintXX_t 值转换为适当类型的指针来使用它。类似于:
myDataType* p = reinterpret_cast<myDataType*>(premappedAddress);
有关详细信息,您应该查找其他讨论嵌入式系统的站点。