我在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)
问候
麦克风
他们每个人都做不同的事情.
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_data有shared_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)
| 归档时间: |
|
| 查看次数: |
3706 次 |
| 最近记录: |