Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法播放共享的\u ptr<;无效>;至共享\u ptr<;T>;?_C++_Shared Ptr_Void Pointers_Reference Counting - Fatal编程技术网

C++ 有没有办法播放共享的\u ptr<;无效>;至共享\u ptr<;T>;?

C++ 有没有办法播放共享的\u ptr<;无效>;至共享\u ptr<;T>;?,c++,shared-ptr,void-pointers,reference-counting,C++,Shared Ptr,Void Pointers,Reference Counting,我想保持std::shared的智能行为。那么,有没有一种方法可以在不混淆引用计数的情况下将共享的void指针强制转换为另一种类型呢?我无法获取原始指针并从中创建新的共享指针。您可以使用或取决于您想要的强制转换类型。您可以从中使用指针强制转换;但是要小心。在这里很容易无意中触发未定义的行为: struct MyClass {}; void* rawPtr = new MyClass; shared_ptr<void> exampleVoid(rawPtr); // Undefine

我想保持std::shared的智能行为。那么,有没有一种方法可以在不混淆引用计数的情况下将共享的void指针强制转换为另一种类型呢?我无法获取原始指针并从中创建新的共享指针。

您可以使用或取决于您想要的强制转换类型。

您可以从中使用指针强制转换;但是要小心。在这里很容易无意中触发未定义的行为:

struct MyClass {};

void* rawPtr = new MyClass;
shared_ptr<void> exampleVoid(rawPtr); // Undefined behavior;
                                      // calls delete (void*)ptr;

shared_ptr<void> exampleVoidCons(new MyClass);
    // OK, calls shared_ptr<void>::shared_ptr<MyClass>(MyClass*) which
    // makes a deleter calling delete (MyClass*)ptr;

shared_ptr<MyClass> example(new MyClass); // OK, calls delete (MyClass*)ptr;

shared_ptr<void> castToVoid = static_pointer_cast<void>(example);
    // OK, shared_ptr's deleter is erased so this still calls delete (MyClass*)ptr;
struct MyClass{};
void*rawPtr=新的MyClass;
共享\u ptr示例无效(rawPtr);//不明确的行为;
//调用删除(void*)ptr;
共享的ptr示例voidcons(新MyClass);
//好的,调用shared_ptr::shared_ptr(MyClass*),其中
//使一个deleter调用delete(MyClass*)ptr;
共享_ptr示例(新MyClass);//好的,调用delete(MyClass*)ptr;
共享\u ptr castToVoid=静态\u指针\u强制转换(示例);
//好的,共享的ptr的deleter被擦除了,所以这仍然调用delete(MyClass*)ptr;
通常,这种未定义的行为将导致不调用类型的析构函数。例如,请注意,放入
void*
的版本从未打印它已被销毁


参见C++11 5.3.5[expr.delete]/3:

在第一个备选方案(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,并且静态类型应具有虚拟析构函数,或者行为未定义


由于实际对象永远不会有动态类型
void
,并且
void
也永远不会是动态类型的基类,
delete
ing
ing
void*
触发未定义的行为。

可能重复@BillyONeal:No,
void
不是所有类型的基类。C++不是纯粹的OO。@ MsAlter:这就是为什么我写评论而不是实际投票来关闭(我不想单方面地做)的一个以前版本的答案有一个不正确的<代码> SyddypTpRealPoPoeVoice(新MyClass)< /Cord>部分,我现在已经修复了。请随意取消我的投票:P+1可以提供更完整的答案,也可以承认你犯了错误,应该鼓励承认并纠正错误,我们大多数人在这里学习,这是过程的一部分。我很生气,因为你删除了编辑答案,就在我就错误的示例写评论时;-)@史蒂夫:我抢了你的风头,是吗?:)