std :: shared_ptr分配数据与memcpy

mad*_*uci 1 shared-ptr c++11

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

T a_data;
std::shared_ptr<T> my_pointer(new T);
*my_pointer = a_data;
Run Code Online (Sandbox Code Playgroud)

或者喜欢:

memcpy(&my_pointer, data, sizeof(T));
Run Code Online (Sandbox Code Playgroud)

或者喜欢:

my_pointer.reset(a_data);
Run Code Online (Sandbox Code Playgroud)

问候

麦克风

Rei*_*ica 7

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

1.

T a_data;
std::shared_ptr<T> my_pointer(new T);
*my_pointer = a_data;
Run Code Online (Sandbox Code Playgroud)

这里,将分配,管理n类型的新对象(称之为).然后,将对象复制分配到.Tmy_pointera_datan

2.

memcpy(&my_pointer, a_data, sizeof(T));  // I assume you meant a_data here, not data
Run Code Online (Sandbox Code Playgroud)

这完全是胡说八道 - 用shared_ptr 自己的内容覆盖自己a_data.最精细的未定义行为(预计崩溃或内存损坏).

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

3.

my_pointer.reset(a_data);
Run Code Online (Sandbox Code Playgroud)

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


如果你只需要管理一个动态分配的副本a_datashared_ptr,这样做:

T a_data;
std::shared_ptr<T> my_pointer(new T(a_data));
Run Code Online (Sandbox Code Playgroud)

甚至更好:

T a_data;
auto my_pointer = std::make_shared<T>(a_data);
Run Code Online (Sandbox Code Playgroud)