在 Qt 框架中,`QSharedPointer` 是一个智能指针,用于自动管理对象的生命周期。当你试图将一个裸指针(例如 `QLabel*`)赋给一个 `QSharedPointer<QLabel>` 时,会出现错误。`QSharedPointer` 没有定义用于从裸指针赋值的操作符 `=`。
假设 `QLabel` 是一个类,你可以使用如下方式修正这个错误:
1. 如果你正在创建一个新的 `QLabel` 对象并希望用 `QSharedPointer` 管理它,你应该这样做:
QSharedPointer<QLabel> label = QSharedPointer<QLabel>::create(args...);
其中 `args...` 是传递给 `QLabel` 构造函数的参数。`create` 方法会创建一个 `QLabel` 的实例,并返回控制该实例的 `QSharedPointer`。
2. 如果你已经有了一个 `QLabel*` 类型的指针,并且你确定没有其他 `QSharedPointer` 正在管理这个指针,你可以这样做:
QLabel* rawPointer = new QLabel(args...); // 假设你以这种方式创建了一个裸指针
QSharedPointer<QLabel> label(rawPointer);
注意,当你以这种方式构造 `QSharedPointer` 时,你需要确保没有其他 `QSharedPointer` 正在管理同一个裸指针,否则当多个智能指针试图删除同一个对象时,将导致运行时错误。
3. 如果你确实需要将一个已经存在的 `QLabel*` 指针赋值给 `QSharedPointer`,而且这个指针没有被其他智能指针管理,你可以使用 `reset` 方法:
QSharedPointer<QLabel> label;
QLabel* existingPointer = getQLabelPointerSomehow();
label.reset(existingPointer);
再次强调,你必须确定没有其他 `QSharedPointer` 正在管理这个指针。否则,当原来管理这个裸指针的 `QSharedPointer` 试图析构这个对象时,会引发问题。
使用注意的坑
Qt——代码崩溃 free() invalid pointer-CSDN博客