C++ C++;在无序列表中存储和传递引用而不是值
我有一些编译和运行良好的代码,但按值传递对象:C++ C++;在无序列表中存储和传递引用而不是值,c++,pass-by-reference,unordered-map,C++,Pass By Reference,Unordered Map,我有一些编译和运行良好的代码,但按值传递对象: AssetRepository AssetRepositoryFactory::getAssetRepository(std::string clientId) { std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId); if ( iterator != m_repositor
AssetRepository AssetRepositoryFactory::getAssetRepository(std::string clientId)
{
std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId);
if ( iterator != m_repositories.end())
{
return iterator->second;
}
else
{
AssetRepository repository = AssetRepository(clientId);
std::pair<std::string, AssetRepository> pair (clientId, repository);
m_repositories.insert(pair);
return repository;
}
}
如果我叫它via
AssetRepository repository = AssetRepositoryFactory::getInstance().getAssetRepository("clientId0");
或者,如果我打电话
AssetRepository &repository = AssetRepositoryFactory::getInstance().getAssetRepository("clientId0");
我明白了
First-chance exception at 0x000007FEE72EAD7B (RTDynamics-vc11-md-64.dll) in CGF_flight_controller.exe: 0xC0000005: Access violation reading location 0x0000000000000028.
Unhandled exception at 0x000007FEE72EAD7B (RTDynamics-vc11-md-64.dll) in CGF_flight_controller.exe: 0xC0000005: Access violation reading location 0x0000000000000028.
由于我通常是一名Java开发人员,我很难理解如何通过引用显式传递。有人能帮我弄清楚吗?这个代码完全错了
AssetRepository& function() {
[...]
AssetRepository repository = [...];
[...]
return repository; // by reference
// but "repository" gets destroyed...
}
在函数返回后,返回对不存在的对象的引用。不要那样做。这被称为“悬挂参考”(将其放入谷歌)。只能使用对现有对象的引用。问题在于:
std::unordered_map<std::string, AssetRepository&>
std::无序映射
容器的值应为。但是引用是不可分配的。在声明它们时只能初始化它们一次,以后不能使它们引用其他内容
但你有一些解决办法:
- 在工作代码中使用值。和用于降低复制值的成本
- 在地图中使用指向AssetPository的指针:
std::无序地图
- 用于使引用可分配
有关更多信息和解决方案,请查看此问题:我最终找到了一个解决方案,并合并了关于悬空引用的评论和使用指针的建议
AssetRepository* AssetRepositoryFactory::getAssetRepository(std::string clientId)
{
std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId);
if ( iterator != m_repositories.end())
{
AssetRepository repository = iterator->second;
return &(iterator->second);
}
else
{
AssetRepository repository = AssetRepository(clientId);
std::pair<std::string, AssetRepository> pair (clientId, repository);
m_repositories.insert(pair);
return getAssetRepository(clientId);
}
}
AssetPository*AssetPositionFactory::GetAssetPository(std::string clientId)
{
std::unordered_map::iterator iterator=m_repositories.find(clientId);
if(迭代器!=m_repositories.end())
{
AssetRepository repository=iterator->second;
返回&(迭代器->秒);
}
其他的
{
资产存储库=资产存储库(clientId);
std::pair对(clientId,repository);
m_存储库。插入(对);
返回getAssetRepository(clientId);
}
}
我想这与类的定义有关AssetPository
。请把它寄出去。
std::unordered_map<std::string, AssetRepository&>
AssetRepository* AssetRepositoryFactory::getAssetRepository(std::string clientId)
{
std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId);
if ( iterator != m_repositories.end())
{
AssetRepository repository = iterator->second;
return &(iterator->second);
}
else
{
AssetRepository repository = AssetRepository(clientId);
std::pair<std::string, AssetRepository> pair (clientId, repository);
m_repositories.insert(pair);
return getAssetRepository(clientId);
}
}