首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据的std::shared_ptr分配与memcpy

数据的std::shared_ptr分配与memcpy
EN

Stack Overflow用户
提问于 2014-02-19 09:50:41
回答 1查看 6.2K关注 0票数 3

我在C++11中使用的是C++11,我想了解用这种方式分配T类型的结构是否更好:

代码语言:javascript
运行
复制
T a_data;
std::shared_ptr<T> my_pointer(new T);
*my_pointer = a_data;

或者说:

代码语言:javascript
运行
复制
memcpy(&my_pointer, data, sizeof(T));

或者说:

代码语言:javascript
运行
复制
my_pointer.reset(a_data);

问候

麦克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-19 10:02:38

他们每个人都做不同的事情。

1.

代码语言:javascript
运行
复制
T a_data;
std::shared_ptr<T> my_pointer(new T);
*my_pointer = a_data;

在这里,将分配一个类型为n的新对象(称为T ),由my_pointer管理。然后,将对象a_data复制到n中.

2.

代码语言:javascript
运行
复制
memcpy(&my_pointer, a_data, sizeof(T));  // I assume you meant a_data here, not data

这完全是胡说八道--tha用shared_ptr的内容覆盖了a_data本身。未定义的行为最好(预期崩溃或内存损坏)。

也许您实际上是指my_pointer.get()而不是&my_pointer (也就是说,您想要复制到所指向的对象中)?如果是这样的话,它就可以工作,只要T是微不足道的可复制的--这意味着它没有非平凡的副本或移动函数,没有非平凡的复制或移动赋值运算符,并且有一个平凡的析构函数。但是为什么要依赖它呢,当正常赋值(*my_pointer = a_data;)在这种情况下完全相同,并且也适用于不可复制的类时?

3.

代码语言:javascript
运行
复制
my_pointer.reset(a_data);

这通常不会按-原样编译,它需要是my_pointer.reset(&a_data);。这是等待发生的灾难--您将my_pointer指向自动(=局部变量)变量a_data,并赋予它对该变量的所有权。这意味着当my_pointer超出作用域时(实际上,当最后一个指针共享所有权时),它将调用删除器,后者通常调用delete。在a_data上,它没有与new一起分配。欢迎再次来到UB的土地!

如果您只需要使用a_data管理动态分配的shared_ptr副本,请执行以下操作:

代码语言:javascript
运行
复制
T a_data;
std::shared_ptr<T> my_pointer(new T(a_data));

甚至更好:

代码语言:javascript
运行
复制
T a_data;
auto my_pointer = std::make_shared<T>(a_data);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21876752

复制
相关文章

相似问题

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