c ++对堆对象的引用?

时间:2018-06-06 17:44:54

标签: c++ reference

我有以下代码:

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>();

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

2 个答案:

答案 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;

更新,以回应OP的评论

你在评论中说过

  

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

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

如果您不需要此对象超出使用范围,则最好使用第一个变体。