为什么 std::equal_to会导致动态分配?
why would std::equal_to cause dynamic allocation?
考虑以下简单示例,我使用std::equal_to
来比较两个std::pair<std::string, unsigned>
。operator new
已重载,以便在进行分配时打印一条消息(此处为实时代码(:
#include <functional>
#include <string>
#include <iostream>
// overloaded to see when heap allocations take place
void* operator new(std::size_t n)
{
std::cout << "Allocating " << n << std::endl;
return malloc(n);
}
int main()
{
using key_type = std::pair<std::string, unsigned>;
auto key1 = std::make_pair(std::string("a_______long______string______"), 1);
auto key2 = std::make_pair(std::string("a_______long______string______"), 1);
std::cout << "Finished initial allocationsnn" << std::endl;
std::equal_to<key_type> eq;
eq(key1, key2); // how can this cause dynamic allocation???
}
我看到的消息是
Allocating 31
Allocating 31
Finished initial allocations
Allocating 31
Allocating 31
您可以看到在比较key1
和key2
时发生了两个分配。但是为什么?std::equal_to
的运算符通过常量引用获取其参数,因此不应进行分配...我错过了什么?谢谢。
这是因为您复制了这些对。
keyX
的类型是std::pair<std::string, int>
。eq
有一个函数调用运算符,用于参数const std::pair<std::string, unsigned>&, const std::pair<std::string, unsigned>&
。由于类型不匹配,因此引用不能直接绑定到参数。但是,int
可以隐式转换为unsigned
,因此给定的 pair 可以隐式转换为参数对。
因此,您隐式地为比较创建了一对临时参数。临时字符串的创建会导致内存分配。
如果您使用std::equal_to<>
作为比较运算符,则它不会在推断参数类型时创建副本,因此不会导致转换。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存