有没有一种安全的方法可以将C++ 11智能指针和原始指针接口一起使用?

Uni*_*rsE 13 c++ qt interface smart-pointers c++11

我想在新项目中使用C++ 11 Smart Pointers,并遇到问题.许多当前项目仍在其接口中使用原始指针作为参数,并且没有智能指针的接口,例如QMainWindow :: setCentralWidget.

为了保持类型一致,我必须get()像这段一样传递存储的指针:

QMainWindow win;

std::shared_ptr<QWidget> scrollArea{ std::make_shared<QScrollArea>() };
// QScrollArea is a derived class of QWidget.

win.setCentralWidget(scrollArea.get());
Run Code Online (Sandbox Code Playgroud)

但我无法确定Qt中的其他方法是否delete对存储的指针执行运算符scrollArea.

如果Qt中的某些方法可以导致内存泄漏或其他问题吗?

我检查了最新的C++标准CD,但没有发现任何内容.似乎这是一个未定义的行为.

如果这样做是一个未定义的行为并且很危险,是否有一种安全的方法可以使用带有原始指针接口的智能指针?

Rei*_*ica 16

一般情况下没有这种方式.对于您要使用的每个"遗留"接口,您必须阅读其文档以了解它如何与所有权交互(std智能指针封装的内容).单个对象只能由一个所有权方案管理.

有了Qt特别,它绝对不是安全的混合智能指针和Qt管理.Qt在QObjects 之间的父/子关系包括所有权语义(当父项为子项时会删除子项),因此您无法安全地将其与任何其他所有权方案(例如std智能指针)混合使用.

请注意,您链接的Qt文档明确声明" QMainWindow获取窗口小部件指针的所有权并在适当的时间删除它".