我有下面的代码:
map<int,int>& myMap = new map<int,int>();
Run Code Online (Sandbox Code Playgroud)
但我得到以下编译器错误:
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>>>".
Run Code Online (Sandbox Code Playgroud)
这是否意味着我必须这样做:
map<int,int>& myMap = *new map<int,int>();
Run Code Online (Sandbox Code Playgroud)
我认为对象可以传递给引用而不首先解除引用(而不是指针)?此外,我知道智能指针存在,但我现在不想尝试使用它们.
您可以使用
map<int,int>& myMap = *new map<int,int>();
Run Code Online (Sandbox Code Playgroud)
但我不推荐它.
必须取消分配动态分配的内存.那时,你需要使用一些东西
delete &myMap;
Run Code Online (Sandbox Code Playgroud)
那是质量差的代码,IMO.
如果需要动态分配的内存,请使用智能指针.
std::shared_ptr<map<int,int>> ptr = new map<int,int>();
Run Code Online (Sandbox Code Playgroud)
如果您需要使用参考,您可以使用:
map<int,int>& myMap = *ptr;
Run Code Online (Sandbox Code Playgroud)
如果你可以完全避免动态分配对象并使用自动对象(堆栈内存中的对象),那将会更好.
map<int,int> myMap;
Run Code Online (Sandbox Code Playgroud)
你在评论中说
是的,我想保留该引用,因为我将它传递给递归函数
C++处理它的方法是通过引用传递一个对象.
void recursive_foo(std::map<int, int>& myMap)
{
}
void foo_user()
{
std::map<int, int> myMap;
// Fill up myMap
// ...
recursive_foo(myMap);
}
Run Code Online (Sandbox Code Playgroud)
如果递归函数不修改对象,则可以遵循标准库使用的惯用法并使用迭代器.
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());
}
Run Code Online (Sandbox Code Playgroud)