地狱'○
我想创建自己的动态数组(矢量)类,但不知道如何在我指向的地址上分配内存。在功能添加我添加如下行:
int * object = new (this->beginning + this->lenght) int (paramValue);
但是visual studio向我显示了一条错误消息"使用给定的参数"无法调用operator new。如何使它工作,我应该将哪些参数发送到 new 运算符?
答案 0 :(得分:3)
(我不确定你的问题,但......)
您可能希望使用placement new运算符(但要实现您不需要的<vector>
类似内容)。然后,您需要#include <new>
但你可能不需要那样做。只需从构造函数中调用plain new
,然后从析构函数中调用plain delete
。像int*arr = new int[length];
(在构造函数中)和后来的delete[] arr;
(在析构函数中)。
(看起来你误解了一些东西;我建议你花几天时间阅读一本好的C++ programming书)
答案 1 :(得分:1)
如何在我指向的地址上分配内存
信息不足 - 什么样的系统?定制硬件? OS?
在桌面上,您可以使用两个步骤。您可以使用以下内容分配一个字节块:
uint8_t* myMemoryBlock = new uint8_t[1000]; // 1000 byte block
然后你可以考虑使用'myMemoryBlock'在地址“你指向”的情况下使用贴图new,并使用强制转换。
在桌面上,动态内存系统可以这种方式使用......
但是,如果您打算以任何方式创建用户定义的类型,只需要新的类型,并让动态内存落在可能的位置,而不是将其放在myMemoryBlock上。
在桌面上,(通常)没有用户权限级别可执行文件可以使用“new”访问的内存。所有其他内存都受到保护。
Linux上的mmap将设备或文件映射到可执行文件的内存范围。我不熟悉这些设备,但我已经将mmap用于文件。更新2017/03/19
注1 - 通常阻止用户权限级别任务访问其他/特殊内存。
注2 - 内存地址,例如上面的“myMemoryBlock”,是虚拟的,而不是物理的。这包括代码地址,自动内存地址,动态内存地址。如果您的处理器具有内存管理硬件支持,则您的编码需要特别努力访问内存或其他方面的物理地址。
在单板计算机(SBC)上,(有或没有操作系统)我希望您希望“分配”的地址不在董事会支持包设置的“动态”内存中( BSP)。
在这种嵌入式系统上(在SBC上),某人(建筑师)已将“特殊”存储器“映射”到不用于其他目的的地址范围(即不是动态存储器的一部分)。在这里,您只需找出地址是什么,并通过将uintXX_t值转换为适当类型的指针来使用它。类似的东西:
myDataType* p = reinterpret_cast<myDataType*>(premappedAddress);
有关详细信息,您应该寻找其他讨论嵌入式系统的网站。