c++ - 指向 void 的指针变成智能指针

标签 c++ qt memory-management

我正在尝试创建一个带有自定义删除器的 void 的 QScopedPointer,以正确管理来自 C 库的资源(它只向其内部数据结构提供 void* )。 但是,当我尝试实例化 void 的 QScopedPointer 时,出现此错误:

/Library/Frameworks/QtCore.framework/Headers/qscopedpointer.h:104:14:
error: cannot form a reference to 'void'
    inline T &operator*() const
(from Clang)

或者这个:

/Library/Frameworks/QtCore.framework/Headers/qscopedpointer.h:104:
error: forming reference to void
(from GCC)

我想专门化 QScopedPointer 或编写一个带有自定义删除器的基本作用域指针,但在这两种情况下,我最终都复制了与 QScopedPointer 中完全相同的代码。

有什么方法可以去掉(或专门化)那个特定的函数,这样编译器就不会再报错了吗?

最佳答案

没有。没有办法编写该函数,使其不会让编译器大吃一惊。你应该问问自己这有什么意义。一个指向 void 的智能指针怎么能做一些本来就不可能用 void* 做的事情?

void * vptr; *vptr = ??;  ?? = *vptr;  f(*vptr);

这些陈述根本没有任何意义。

void* 类型是一种非常特殊的类型,旨在提供 C 中的不透明类型。您可以在 C++ 中使用它,但通常您不想这样做。我有一种感觉,无论您想做什么,总有更好的方法。

如果你真的需要一个智能的不透明指针类型,你必须实现它并且你必须省略取消引用功能。

令我感到惊讶的是,C++ 编译器被要求不编译未使用的模板的成员函数。这向我表明您实际上是在尝试取消引用 void 指针。你不能那样做。如果你想让指针脱离智能指针,你可以使用 get()。我确定 QScopedPointer 或任何具有类似功能的东西。

关于c++ - 指向 void 的指针变成智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465490/

相关文章:

c++ - 双重检查锁定模式

c++ - Qt Designer 类似于 3D Slicer 的菜单格式

c++ - QWidget 中的 SDL_Surface

python - PySide:如果我将具有自己布局的自定义小部件添加到父小部件的布局中,它就会有一个偏移量。这是什么原因造成的?

python - 使用朴素贝叶斯分类器训练大型数据集时出现内存错误

c++ - 如何安装libusb?

c++ - 我可以从 STA dll 运行 QT 或 wxWidgets GUI 吗?

c++ - 对 void 及其含义的困惑。

c - char数组的内存分配

java - Java VM 是否移动内存中的对象,如果是,如何移动?