我有以下代码:
map<int,int>& myMap = new map<int,int>();
但是我得到以下编译器错误:
no suitable constructor exists to convert from "std::map<int,int, std::less<int>, std::allocator<std::pair<const int, int>>>*" to "std::map<int,int, std::less<int>, std::allocator<std::pair<const int, int>>>".
这是否意味着我必须这样做:
map<int,int>& myMap = *new map<int,int>();
我认为对象可以传递给引用而不首先解除引用(而不是指针)?此外,我知道智能指针存在,但我现在不想尝试使用它们。
答案 0 :(得分:6)
您可以使用
map<int,int>& myMap = *new map<int,int>();
但我不推荐它。
必须取消分配动态分配的内存。那时,你需要使用
的内容delete &myMap;
这是质量差的代码,IMO。
使用智能指针如果需要动态分配内存。
std::shared_ptr<map<int,int>> ptr = new map<int,int>();
如果您需要使用参考,可以使用:
map<int,int>& myMap = *ptr;
如果你可以完全避免动态分配对象并使用自动对象(堆栈内存中的对象),那将会更好。
map<int,int> myMap;
你在评论中说过
是的,我想保留该引用,因为我将它传递给递归函数
C ++处理它的方法是通过引用传递一个对象。
void recursive_foo(std::map<int, int>& myMap)
{
}
void foo_user()
{
std::map<int, int> myMap;
// Fill up myMap
// ...
recursive_foo(myMap);
}
如果递归函数没有修改对象,你可以按照标准库使用的惯用法来代替使用迭代器。
void recursive_foo(std::map<int, int>::iterator start,
std::map<int, int>::iterator end)
{
}
void foo_user()
{
std::map<int, int> myMap;
// Fill up myMap
// ...
recursive_foo(myMap.begin(), myMap.end());
}
答案 1 :(得分:2)
我认为对象可以传递给引用而不首先解除引用(而不是指针)?
可以传递对象,但是你有什么:
map<int,int>& myMap = new map<int,int>();
不是对象,而是您尝试通过指向动态分配的对象进行初始化的引用。只需创建对象:
map<int,int> myMap;
它应该可以正常工作。
为了说清楚,你混合了不同的概念,假设我们有一个函数通过引用接受sometype
的变量:
void func( sometype &ref ) { ... }
这并不意味着您必须将变量声明为引用以将其传递到那里,您可以传递自动对象:
sometype auto_object;
func( auto_object );
或传递动态分配的:
sometype *ptr_to_object = new sometype;
func( *ptr_to_object );
delete ptr_to_object; // or better use smart pointer
如果您不需要此对象超出使用范围,则最好使用第一个变体。