首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从函数C++ 11安全返回和处理动态分配的内存

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

Stack Overflow用户
提问于 2019-03-26 14:04:18
回答 2查看 390关注 0票数 0

我对C++很陌生,因此对智能指针的概念和用法也是新的。我希望动态地为函数中的结构分配内存,然后在接收方使用该内存完成之后。我希望唯一(而不是共享)接收器安全释放内存。如下所示:

代码语言:javascript
运行
复制
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++有智能指针的概念,特别是在这方面。你能帮我把上面的逻辑转换成使用智能指针吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-26 14:14:59

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

代码语言:javascript
运行
复制
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原则。标准库中的智能指针就是这样做的:

代码语言:javascript
运行
复制
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。实际上,不使用它是惯用的:

代码语言:javascript
运行
复制
struct myStruct {
  int x;
  int y;
};
票数 2
EN

Stack Overflow用户

发布于 2019-03-26 14:15:55

使用唯一的指针std::unique_ptr。如果使用c++14和更高版本进行编码,那么您可以从创建myStruct对象并将其封装在唯一指针的std::make_unique中获益。

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55359102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档