为什么我不能传递ULARGE_INTEGER的共享指针,而是传递ULARGE_INTEGER *没有问题?

时间:2015-12-08 16:07:23

标签: c++ pointers

这是我的问题:

std::shared_ptr<ULARGE_INTEGER> freeBytesAvailable = std::shared_ptr<ULARGE_INTEGER>(new ULARGE_INTEGER);
std::shared_ptr<ULARGE_INTEGER> totalNumberOfBytes = std::shared_ptr<ULARGE_INTEGER>(new ULARGE_INTEGER);
std::shared_ptr<ULARGE_INTEGER> totalNumberOfFreeBytes = std::shared_ptr<ULARGE_INTEGER>(new ULARGE_INTEGER);

ULARGE_INTEGER *test = new ULARGE_INTEGER;
ULARGE_INTEGER *test2 = new ULARGE_INTEGER;
ULARGE_INTEGER *test3 = new ULARGE_INTEGER;

if (GetDiskFreeSpaceEx(NULL, test3, test2, test))
{
    //do something
}

如您所见,我想调用GetDiskFreeSpaceEx,并且作为参数,它需要PULARGE_INTEGER,因此指向ULARGE_INTEGER

的指针

如果我使用test,test2和test3作为参数,它可以正常工作。 但是,我想了解智能指针,因此尝试在我的代码中包含一些并使用它们。

每当我尝试传递智能指针时,我都会遇到转换错误,因此数据类型出现问题,但我无法弄清楚问题。

两者都不应指向ULARGE_INTEGER吗?

有人可以帮忙吗?我的猜测是,我必须将原始指针解包出智能指针包装器,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:5)

共享指针实际上只是封装原始指针的对象。因此,只有当被调用函数接受共享指针作为参数时,才能将共享指针作为函数参数传递!您不能传递原始指针代替共享指针,反之亦然。但是,有些情况下您可能希望将基础原始指针作为参数传递给函数调用。当您必须进行C库调用时,通常就是这种情况。在这种情况下,只需使用共享指针对象上的get()方法提取底层原始指针。 因此,在您的情况下,对GetDiskFreeSpaceEx的调用应为:

GetDiskFreeSpaceEx(NULL,freeBytesAvailable.get(), totalNumberOfBytes.get(), totalNumberOfFreeBytes.get() )

假设函数按此顺序获取这些参数。

答案 1 :(得分:0)

我找到了一个解决方案,所以我会把它写下来寻找快速解决方案的人:

.get()

将返回原始指针,因此如果您尝试将智能指针传递给期望指针的函数,只需添加它就可以了。你好了。