c ++对堆对象的引用?

Fan*_*753 1 c++ reference

我有下面的代码:

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)

我认为对象可以传递给引用而不首先解除引用(而不是指针)?此外,我知道智能指针存在,但我现在不想尝试使用它们.

R S*_*ahu 7

您可以使用

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)

更新,以回应OP的评论

你在评论中说

是的,我想保留该引用,因为我将它传递给递归函数

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)

  • 我会保留推荐这样的代码`map <int,int>&myMap =*new map <int,int>();`给新手程序员.后来有人会注意到这个丑陋并用自动对象"修复"它可能会在代码中留下`delete&myMap;`.应正确维护数据类型. (3认同)
  • @ Fancypants753,这不足以成为使用动态分配对象的理由.您可以将在堆栈上创建的对象传递给递归函数. (2认同)
  • @ Fancypants753,不要通过值传递.通过引用传递. (2认同)