从函数C ++ 11安全返回和处理动态分配的内存

问题描述 投票:0回答:2

我是C ++的新手,因此也是智能指针概念和用法的新手。我想为函数中的结构动态分配内存,然后一旦使用该内存完成接收器。我希望独特的(不共享的)接收器能够安全地释放内存。类似于以下内容:

typedef struct {
  int x;
  int y;
} myStruct;

myStruct* initMem(void)
{
   myStruct* result = new myStruct();
   result->x = 12;
   result->y = 14;
   return result;
}

int main()
{
  cout << ">>>>> Main | STARTED <<<<<" << endl;
  myStruct* w = initMem();
  cout << w->x << endl;
  cout << w->y << endl;
  delete w;
  return 1;
}

注意:上面只是我想要实现的示例。结构远比这复杂得多,我只能使用动态内存分配。

我读到在C ++中使用原始指针进行动态内存管理是不好的,因为C ++具有智能指针的概念,尤其是对此。能否帮助我将上述逻辑转换为使用智能指针。

提前致谢。

c++ c++11 smart-pointers dynamic-memory-allocation
2个回答
1
投票

没有理由使用指针和动态分配的内存。使用自动存储时间:

myStruct initMem()
{
   myStruct result{};
   result.x = 12;
   result.y = 14;
   return result;
}

int main()
{
  cout << ">>>>> Main | STARTED <<<<<" << endl;
  myStruct w = initMem();
  cout << w.x << endl;
  cout << w.y << endl;
}

如果您有充分的理由使用动态分配的内存,那么您必须遵守RAII原则。标准库中的智能指针就是这样做的:

std::unique_ptr<myStruct> initMem(void)
{
   auto result = std::make_unique<myStruct>();
   result->x = 12;
   result->y = 14;
   return result;
}

int main()
{
  std::cout << ">>>>> Main | STARTED <<<<<" << std::endl;
  std::unique_ptr<myStruct> w = initMem();
  std::cout << w->x << std::endl;
  std::cout << w->y << std::endl;
}


同样在C ++中,您不需要typedef。实际上不使用它是不恰当的:

struct myStruct {
  int x;
  int y;
};

1
投票

使用独特的指针std::unique_ptr。如果用c ++ 14及更高版本编码,那么你可以从std::make_unique中受益,它创建了一个myStruct对象并将其包裹在一个唯一的指针周围。

但即使您不使用c ++ 14或更高版本,您也可以自己创建make_unique函数并相应地使用它。

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

所以c ++ 11中的以下示例将使用make_unique而不是std::make_unique

#include <iostream>
#include <memory>

struct myStruct
{
    int x;
    int y;

    myStruct(int x_, int y_) : x(x_), y(y_)
    {
        std::cout<< "Calling user-def constructor..." <<std::endl;
    }

    ~myStruct()
    {
        std::cout<< "Calling default destructor..." <<std::endl;
    }
};

int main()
{
    std::cout << ">>>>> Main | STARTED <<<<<" << std::endl;

    std::unique_ptr<myStruct> ptr = std::make_unique<myStruct>(2,3);

    std::cout<< ptr->x << "," << ptr->y <<std::endl;
}

在线示例:https://rextester.com/TLIPO27824

© www.soinside.com 2019 - 2024. All rights reserved.