我在C++11中使用的是C++11,我想了解用这种方式分配T类型的结构是否更好:
T a_data;
std::shared_ptr<T> my_pointer(new T);
*my_pointer = a_data;
或者说:
memcpy(&my_pointer, data, sizeof(T));
或者说:
my_pointer.reset(a_data);
问候
麦克
发布于 2014-02-19 10:02:38
他们每个人都做不同的事情。
1.
T a_data;
std::shared_ptr<T> my_pointer(new T);
*my_pointer = a_data;
在这里,将分配一个类型为n
的新对象(称为T
),由my_pointer
管理。然后,将对象a_data
复制到n
中.
2.
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.
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
副本,请执行以下操作:
T a_data;
std::shared_ptr<T> my_pointer(new T(a_data));
甚至更好:
T a_data;
auto my_pointer = std::make_shared<T>(a_data);
https://stackoverflow.com/questions/21876752
复制相似问题