zeb*_*und 2 c++ pointers memory-management pass-by-reference shared-ptr
假设我有以下函数(其中mVertexShader是一个std::shared_ptr< ID3D11VertexShader >类成员,并且mRenderData只是POD持有其他D3D的东西):
void VertexShader::CreateShader( void )
{
GVertexShader* raw_VertexShader = mVertexShader.get();
mRenderData->Device->CreateVertexShader(
mCompiledShader->GetBufferPointer(),
mCompiledShader->GetBufferSize(),
NULL,
&raw_VertexShader
);
delete raw_VertexShader;
raw_VertexShader = NULL;
}
Run Code Online (Sandbox Code Playgroud)
因为mVertexShader.get()返回原始指针,会删除raw_VertexShader指针内部的 效果mVertexShader.get(),或者,当指向的内存相同时,指针本身是完全不同的?
我猜测后者,因此首先存在引用指针的原因,但我想确定我有正确的想法.
注意:我目前正在使用MSVC++,尽管很高兴听到MSVC++和MinGW/GCC如何实现这一点有很大的不同.
注2:如果我不清楚,我道歉 - 我根本没有提到D3D的语义,但更多的是关于内存管理,数据传输和动态内存分配的C++语言本身的语义.从这个意义上说,我正在试图准确理解从函数返回原始指针时会发生什么.
即,假设mVertexShader存储一个简单的原始指针指向任意VertexShader,当我调用它的get()方法时,它是否返回一个复制指针,该指针指向与shared_ptr容器内部相同的内存地址,或者它是全新的已经复制并返回的指针,内存指向不同的地址?
这实际上完全是关于语义的std::shared_ptr.该语言非常乐意支持返回指向对象的指针的方法,制作对象的副本并返回指向该对象的指针,或者在对象上碰撞引用计数并返回指向它的指针.如果你愿意,你可以做所有这些事情.
get共享指针上的方法只返回指向对象的原始指针.没有复制.你永远不 应该delete这个指针有两个原因:
另一个对象可能有一个指向同一对象的共享指针,您将从它下面删除该对象.(这是共享指针的重点.)
当最后一个共享指针消失时,该对象将被删除.两次删除对象是UB,可能导致代码崩溃.(这也是共享指针的重点.)
让共享指针完成它们的工作.
请注意,如果调用get共享指针,只要您可以使用所获得的原始指针,就应确保保留该共享指针.否则,该对象可能不再存在.共享指针的逻辑是,只要你保持至少一个引用对象的共享指针,它就不会被删除,当最后一个这样的共享指针消失时,对象会自动删除.