【问题标题】:how to use smart pointers in this case在这种情况下如何使用智能指针
【发布时间】:2018-08-03 00:22:22
【问题描述】:

有没有更好的方法来使用现代 c++ 和智能指针编写这段代码?我想避免通过显式调用 new 和 delete 来处理指向指针类型语法和手动内存管理的可怕指针。

#include <map>

void GetData(std::map<int, int>** data);

int main()
{
    std::map<int, int>* data = nullptr;
    GetData(&data);

    delete data;
    return 0;
}


void GetData(std::map<int, int>** data)
{
    *data = new std::map<int, int>
    {
        {1,1},
        {2,1}
    };

}

【问题讨论】:

  • data 分配在堆上是否有原因,或者您只是来自 Java/C# 背景并且出于习惯这样做?
  • 你应该学会通过引用而不是指针传递东西,就像@Frank所说的那样,根本没有理由动态分配地图。你所要做的就是std::map&lt;int, int&gt; data{{1, 1}, {2, 1}}
  • @FeiXiang,好吧,我在这里给 OP 一个怀疑的好处,这是一个 MCVE,所以他们实际上可能需要动态分配。我觉得这个问题无法正确回答,我们知道这是有意还是无意。
  • 我试图设计一个更简单的场景示例。我的问题可能不够公正。这种情况是数据结构需要填充在与调用者不同的位置,但被调用者需要使用该数据。我想以尽可能少的开销来做到这一点。我可能可以用更清晰的问题示例发布一个不同的问题
  • @BKS 听起来您可能正在寻找参考。如果您在更好的示例中进行编辑,那将会很有帮助。

标签: c++ memory-management c++17 smart-pointers


【解决方案1】:

绝对有更好的写法,而且你根本不需要指针!

#include <map>
#include <iostream> // just for printing using std::cout

auto GetData()
{
    return std::map<int, int>
    {
        {1,1},
        {2,1}
    };    
}

int main()
{
    const auto data = GetData();
    for (auto d : data)
    {
        std::cout << d.first << ", " << d.second << "\n";
    }
}

不再有丑陋的指针语法,不再需要手动分配和释放内存,您无需担心任何事情。

【讨论】:

  • @BKS,你听说过复制省略吗?
  • @BKS 别担心
  • 这是最好的答案,哈哈@downvote。在 C++17 中保证没有副本,直接在data 中构造映射。 (但你应该使用auto&amp;&amp;d 而不是auto d
  • @BKS 大多数编译器会省略副本,因此只会创建一个。如果不发生这种情况,该值将被移出非常有效的函数。
  • @miradulo 抱歉,这就是我的意思。其他人说得最好,我的意思是只创建一个对象,而不是一个对象和一个副本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多