Object 如何保存对象,使其不受';t在C+中被GC收集+/CX

Object 如何保存对象,使其不受';t在C+中被GC收集+/CX,object,null,garbage-collection,c++-cx,pin-ptr,Object,Null,Garbage Collection,C++ Cx,Pin Ptr,这是我为构造函数编写的代码: LmiVideoCapturer* LmiVideoCapturerConstruct_(LmiVideoCapturer* x, const void* implementation) { std::vector<LmiVideoCapturerInfo> &deviceList = LmiVideoCapturerDeviceList::Instance(); LmiVideoCapturerInfo &capturerInfo =

这是我为构造函数编写的代码:

LmiVideoCapturer* LmiVideoCapturerConstruct_(LmiVideoCapturer* x, const void* implementation)
{
std::vector<LmiVideoCapturerInfo> &deviceList = LmiVideoCapturerDeviceList::Instance();
LmiVideoCapturerInfo &capturerInfo = LmiVideoCapturerInfo();
for (std::vector<LmiVideoCapturerInfo>::iterator it = deviceList.begin(); it != deviceList.end(); it++){
    if (LmiStringCompare(&it->uniqueId, &x->uniqueId) == 0){
        capturerInfo = *it;
        break;
    }
}

if (capturerInfo.uniqueId.size > 0){
    x->isBuiltin = LMI_TRUE;

    // set basic device info 
    LmiStringAssign(&x->name, &capturerInfo.name);
    LmiStringAssign(&x->model, &capturerInfo.model);
    LmiStringAssign(&x->manufacturer, &capturerInfo.manufacturer);
    x->position = capturerInfo.position;

    // set video capabilities
    LmiAllocator *a = LmiMallocAllocatorGetDefault();
    Platform::String ^deviceId = LmiStringWinRTString(&capturerInfo.uniqueId, a);
    XTRACE(L"=========================Will call from LMIVideoCapturerConstruct\n");
    LmiVideoCapturerWinRTImplementation ^impl = ref new LmiVideoCapturerWinRTImplementation(deviceId);
    if (impl->Initialize()){
        //TODO will need to save impl inside a pin_ptr (pinned pointer) so it will not be deconstructed by the GC
        x->implementation = reinterpret_cast<void*>(impl);
        LmiVideoCapturerCapability capability;
        LmiVideoCapturerCapabilityConstructDefault(&capability, a);
        capability.height = impl->encodingProfile->Video->Height;
        capability.width = impl->encodingProfile->Video->Width;
        LmiMediaFormat format; 
        LmiMediaFormatConstructFromNative(&format, impl->encodingProfile->Video->ProfileId);
        LmiVectorPushBack(LmiMediaFormat)(&capability.formats, &format);
        double usecs = ((double)impl->encodingProfile->Video->FrameRate->Denominator / impl->encodingProfile->Video->FrameRate->Numerator) * LMI_USECS_PER_SEC;
        LmiTimeRange range;
        LmiTimeRangeConstruct(&range, LmiTimeUsecs(usecs), LmiTimeUsecs(usecs));
        LmiVectorPushBack(LmiTimeRange)(&capability.ranges, &range);
        LmiVectorPushBack(LmiVideoCapturerCapability)(&x->capabilities, &capability);

        return x;
    }

}

return nullptr;

}
lmividecapturer*lmividecapturerconstruct(lmividecapturer*x,const void*实现)
{
std::vector&deviceList=LMIVideCaptureRDeviceList::Instance();
lmividecapturerinfo&capturerInfo=lmividecapturerinfo();
for(std::vector::iterator it=deviceList.begin();it!=deviceList.end();it++){
if(LmiStringCompare(&it->uniqueId,&x->uniqueId)==0){
capturerInfo=*它;
打破
}
}
如果(capturerInfo.uniqueId.size>0){
x->isBuiltin=LMI\u TRUE;
//设置基本设备信息
LmiStringAssign(&x->name,&capturerInfo.name);
LmiStringAssign(&x->model,&capturerInfo.model);
LmiStringAssign(&x->manufacturer,&capturerInfo.manufacturer);
x->position=capturerInfo.position;
//设置视频功能
LmiAllocator*a=LmiMallocAllocatorGetDefault();
Platform::String ^deviceId=LmiStringWinRTString(&capturerInfo.uniqueId,a);
XTRACE(L“==================================将从LMIVideCaptureRConstruct调用“;
lmividecapturerwinr优化实施^impl=ref新的lmividecapturerwinr优化实施(设备ID);
如果(impl->Initialize()){
//TODO需要将impl保存在pin_ptr(固定指针)中,这样GC就不会解构它
x->implementation=reinterpret\u cast(impl);
l机动捕获能力;
LMIVideCaptureR能力结构默认值(和能力,a);
capability.height=impl->encodingProfile->Video->height;
capability.width=impl->encodingProfile->Video->width;
LMIMedia格式;
LMIMediaFormatConstructionFromNative(&format,impl->encodingProfile->Video->ProfileId);
LmiVectorPushBack(LmiMediaFormat)(&capability.formats,&format);
双usecs=((双)输入->编码配置文件->视频->帧速率->分母/输入->编码配置文件->视频->帧速率->分子)*LMI_usecs_/秒;
最小范围;
LmiTimeRangeConstruct(范围、LmiTimeUsecs(usecs)、LmiTimeUsecs(usecs));
l驱动程序回推(LmiTimeRange)(&capability.ranges,&range);
l驱动程序回推(lmividecapturercapability)(&x->capability,&capability);
返回x;
}
}
返回空ptr;
}
现在我想将“impl”保存在某个地方,这就是为什么我将它保存在X中,我将在函数末尾返回。但是一旦这个函数结束,GC就会调用这个对象的解构器。当调用该对象时,如何设置GC避免该对象


<>编辑:在互联网上搜索了几个小时后,我注意到C++有一个叫做PIN指针的东西(PINYPTR),但是我在上面发现的所有例子都显示了保存int的数组。是否可以将对象保存在固定指针内?

在C++/CX中没有垃圾收集


您定义的lmividecapturerwinrtimplementation ^impl变量是一种智能指针类型,它将自动为您管理对象的生存期。有关C++/CX类型的更多信息可以在此处找到:

返回一个T^,或者如果需要将T^包装在结构U中,只需按值返回该U即可


尽量避免使用原始指针。也不要通过强制转换为void*而丢失类型信息。对于WinRT对象,最安全的方法是强制转换到Platform::object^或IInspectable*。在后一种情况下,使用ComPtr存储所属引用。

此代码段中没有.NET或C++/CLI代码片段。语言扩展名为C++/CX,不使用垃圾收集器,固定指针没有意义。当您使用reinterpret_cast时,编译器无法看到本机代码具有对该对象的引用,因此无法发出AddRef()调用以确保该对象保持活动状态。将对象自己存储在一个静态变量或一个存在时间足够长的类的字段中是一个简单的解决方法。所以根据我的理解,我不需要使用固定指针?我可以把它保存在一个静态变量中,然后使用这个变量?顺便说一句:我需要对象的类是另一个类,所以我不在同一个类中使用它,这是一个问题吗?找到一种方法将实例作为^传递给另一个对象。为什么需要一个静态变量?谢谢,我做了一个包装器,这是一个本机结构,它将智能指针保存在其中,因此它不会自动管理。根据定义,启动指针可以很好地与RAII配合使用,所以这不应该是一个问题。(仅当您以某种方式破坏了内存管理)为什么不在本机结构中使用^?这在C++/CX中很好。或者,使用Microsoft::WRL::ComPtr。或者,在紧急情况下,您可以强制转换为原始IInspectable*并自己管理AddRef/Release对。pin_ptr是C++/CLI,不适用于此处。正如回复帖子所提到的,没有GC。