在std::unordered_map中分配ID后创建对象
Create object after ID is allocated in std::unordered_map
我有一个std::unordered_map,它存储一个带有对象的整数。这里有一些代码供您理解:
#include <iostream>
#include <unordered_map>
#include <cstdlib>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "Foo created!" << endl;
}
~Foo()
{
}
};
typedef std::unordered_map<int, Foo*> FooMap;
FooMap fm;
int allocateID()
{
cout << "Allocating ID" << endl;
return rand() % 100;
}
void add()
{
fm.emplace(allocateID(), new Foo());
}
int main()
{
srand(time(NULL));
add();
return 0;
}
输出:
Foo created!
Allocating ID
这里的问题是对象Foo
是在分配ID之前创建的!我尝试在allocateID
上添加一个互斥锁;它不起作用,因为allocateID()
在对象创建后运行。
如何修改此程序,以便在分配ID后创建Foo
?
编辑:
我已经玩过这些代码,并在这里使用了一个解决方案来演示:
void add(int id, Foo *f)
{
auto iden = id;
auto foo = f;
fm[iden] = foo;
}
void add(Foo *f, int id)
{
auto iden = id;
auto foo = f;
fm[iden] = foo;
}
void add()
{
int id = allocateID();
fm[id] = new Foo();
}
在第一个add()
函数中,输出保持不变。这并不能解决问题。
在第二个add()
函数中,输出不同,而是产生:
Allocating ID
Foo created!
在第三个函数中,它已经用其中一个解决方案进行了修改:这个函数也会产生所需的输出。第三个函数的问题是,实际上不太可能有一个空的add()
函数。解决此问题的唯一应受谴责的方法是先传递对象,然后传递id。这可能是因为参数是从右到左读取的,而不管输入要求如何,因为它们是在读取参数之后创建的。
不能依赖函数参数的求值顺序。试试这个:
void add()
{
int temp = allocateID();
fm.emplace(temp, new Foo());
}
除非你完全确定编译器将如何解释你的代码,否则你不想依赖它并让它告诉你想要做什么。既然你有问题,你应该强制编译器首先创建id,如下所示:
void add()
{
int id = allocateID();
fm[id] = new Foo();
}
这将解决您的问题。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 为CListCtrl C++分配组ID
- 具有PPL和并行内存分配的线程ID
- 在std::unordered_map中分配ID后创建对象
- 在尝试使用 new 和 copy 构造函数分配内存时,在 '(' 令牌之前获取"预期的非限定 id"
- 在运行时动态分配MFC命令id
- 为类的每个实例分配唯一 ID
- CUDA:在2D网格中分配线程ID
- 线程id分配有多整齐