标签:allocator placement-new c stl new-operator
我最近用一些使用SSE的Vector / Matrix类替换了,现在我确保内存正确对齐.
根据this question的答案中的建议,我已经为需要它的类替换了operator new / delete,并开始使用自定义分配器与STL容器一起使用 – 但是,两者之间似乎存在一些冲突:
首先,我简单地复制并粘贴了here中的示例分配器类,当我使用它与有问题的类型的std :: vector而没有我的自定义新/删除时编译很好,但是当我替换这些函数时,我从construct()函数得到一个错误“没有匹配函数来调用’operator new’”,
void construct(pointer p, const T& t) { new(p) T(t); }
我想我已经取代了“通常的”新事实,这在某种程度上掩盖了新的位置?但是,鉴于我不能自己编写新的位置,我不知道该怎么办…我是新的(NPI)整个自定义内存分配的东西,所以任何建议都会非常感谢!
我正在使用Clang v3.4(或gcc 4.1.2)在Linux上进行编译;不使用C 11.
非常感谢.
解决方法:
规范的allocator::construct调用:: new((void *)p)T(val)
通过省略::,你可以让名字查找从T的类范围开始,在那里它找到你的类范围的运算符new并且没有继续进行(name lookup在第一个范围内停止,其中找到任何匹配的名称,即使在某些封闭范围内存在更好的候选人)
(转换为void是为了防止用户潜入全局几乎放置的新重载,该重载采用非void指针参数)
PS:正如评论中正确指出的那样,“鉴于我不能写自己的位置新”是错误的假设.您无法替换全局placement-new,但您当然可以编写一个特定于类的placement new,然后通过类范围查找来获取它.查看cppreference以获取有关分配功能的摘要.
标签:allocator,placement-new,c,stl,new-operator 来源: https://codeday.me/bug/20190830/1768443.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。