关于如何使用QSharedPointer对象作为方法参数或方法的返回值,是否有任何良好的实践或规则?
按价值:
LMNode::setParent(QSharedPointer<LMNode> parent)
{
this->parent = parent;
}
QSharedPointer<LMNode> LMNode::getParent()
{
return this->parent;
}
Run Code Online (Sandbox Code Playgroud)
或参考更好:
LMNode::setParent(const QSharedPointer<LMNode>& parent)
{
this->parent = parent;
}
const QSharedPointer<LMNode>& LMNode::getParent()
{
return this->parent;
}
Run Code Online (Sandbox Code Playgroud)
当然,在第二个版本中,我避免了参考计数器的增量和QSharedPointer对象的变化.但是,我必须采取严格的方法吗?
我Boost::shared_ptr在之前的项目中使用过,现在我想在Qt中找到一个智能指针,它做同样/类似的事情.由于Qt中有许多智能指针类,我想知道使用哪一个.是QSharedPointer吗?
我有以下代码:
QPair<QSharedPointer<unsigned int>, int> someclass::somefunction() {
int siz = data_size();
QSharedPointer<unsigned int> buffer(new unsigned int[siz]);
// Fill the buffer...
return qMakePair(buffer, siz);
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,QSharedPointer此函数返回的内容将超出范围,构造函数中设置的指针将被释放.使用valgrind 3.6.1,我得到一个"不匹配的free()/ delete/delete []"错误.我的使用是否有任何问题,QSharedPointer或者我是否必须忍受这种valgrind警告?
一直试图了解共享指针几天,感觉好像我似乎无法得到它.不确定它是否只是显而易见或是否过于复杂.首先,有人可以给我一个例子,你实际上会使用共享指针.维基百科上的例子对我来说毫无意义.如何将共享指针传递给另一个函数或使用共享指针创建一个对象.那么,你如何传递它,你会在哪里使用它?任何信息或示例都会很棒.
另外,我有这个问题,我不知道该用什么.我有这个函数,我分配一个QFile并将其传递给另一个类中的函数.该函数将文件作为a QIODevice*,然后创建包含该文件的对象.我想知道最好的解决方案是什么,以及如何(如果我应该)在这里使用共享指针?如何创建共享指针<QFile>并将其传递到函数所在的位置<QIODevice>.觉得我根本没有得到共享指针......
我的另一种方法是将分配QFile放入a QScopedPointer.然后我将它传递给类,当创建存储文件的对象时,我使用QPointer或QScopedPointer.在第一个调用函数结束时,我应该调用take()吧?
function () {
QScopedPointer<QFile> item(new QFile("filename"));
SomeClassObject->doStuff(item.data());
item.take();
}
---------------------------------
SomeClass::doStuff(QIODevice *item) {
_currentObject = new MyObject(item); // should _currentObject be a smartpointer?
...
}
---------------------------------
class MyObject {
QPointer<QIODevice> _item;
...
MyObject(QIODevice *item) { _item = item; }
}
Run Code Online (Sandbox Code Playgroud)
因此,如果"new"抛出异常,我想要一种存储指针的方法以及在创建过程中处理它们的方法.
在Qt文档中我们读到:
bool QSharedPointer::operator! () const
Returns true if this object is null.
This function is suitable for use in if-constructs, like:
if (!sharedptr) { ... }
Run Code Online (Sandbox Code Playgroud)
和
bool QSharedPointer::isNull () const
Returns true if this object is holding a reference to a null pointer.
Run Code Online (Sandbox Code Playgroud)
这两个功能有什么区别?这很清楚什么是对空指针的引用,但这意味着什么
"如果对象为空"?
什么决定是否QSharedPointer 为空?这些功能如何对应QSharedPointer::data() != null?
我目前有这样的事情:
QSharedPointer<t> Qsharedfoo;
Run Code Online (Sandbox Code Playgroud)
现在我有一个指向foo的原始指针rawfoo.如何让foo指向拥有原始指针并开始指向它.我知道在使用共享指针的boost中我们可以使用它们boost::make_shared
如何使用它QSharedPointer?
我想做这样的事情:
Qsharedfoo = rawfoo
Run Code Online (Sandbox Code Playgroud) 有一天我一直在和Qt一起工作,我想知道为什么他们所有的API都使用普通指针而不是他们自己的智能指针QSharedPointer.
使用它们会不会更加一致?
我来自 C# 背景,仍然对 C++ 和 Qt 智能指针有所了解。这应该是一个基本问题:
在 myClass.h 中
QSharedPointer<AccessFlags> m_flags;
Run Code Online (Sandbox Code Playgroud)
在 myClass.cpp 我试图设置(设置正确的词?)m_flags 指针
if(m_flags.isNull())
m_flags = new AccessFlags();
class AccessFlags{
public:
QHash<QString,int> flags;
AccessFlags(); //The dictionary is setup in the constructor
};
Run Code Online (Sandbox Code Playgroud)
编译器抱怨“没有匹配 'operator=' in.. 如何设置指针?
我在Qt应用程序中有一些间歇性的分段错误.我认为问题与我们(坏)的使用有关QSharedPointer.在Qt文档状态:
QSharedPointer :: QSharedPointer(T*ptr):创建一个指向ptr的QSharedPointer.指针ptr由此QSharedPointer管理,不得传递给另一个QSharedPointer对象或在此对象外删除.
我想我们两个都不能 ......:/
是否有一种OOP方式来强制管理的指针QSharedPointer不能被删除或传递给另一个QSharedPointer?
最好的解决方案是编译错误.
QVector<QSharedPointer<SomeData> > DataVec在一个面向对象的大项目中,我有一个班级的领域.程序在循环执行代码部分期间获得内存溢出,其中分配了大内存,由QSharedPointers控制.
在程序运行周期中,DataVec充满了
DataVec.push_back(QSharedPointer<SomeData>(new SomeData()));
Run Code Online (Sandbox Code Playgroud)
QSharedPointer调用后会被删除(发布)DataVec.pop.back()还是DataVec.clear()?
我想不是.我们必须显式调用析构函数QSharedPointer(我在Qt中也看不到像boost :: shared_ptr :: reset()这样的方法).比,SomeData默认的析构函数(SomeData只有标准Qt容器为域)将被调用,如果我们没有更多的QSharedPointers那点SomeData实例而言,和内存将被释放.现在,我只做pop_back():似乎,我只是松散指向未发布的数据(执行后,valgrind表示我肯定丢失了块,我想它们来自这里).
所以,最后,我是对的吗?我怎样才能QSharedPointer以正确的方式从容器中删除?
编辑1:Qt中的boost :: shared_ptr :: reset()方法是QSharedPointer::clear().
在 Qt 4 中,我有以下数组:
QSharedPointer<unsigned char> encrypted(new unsigned char[RSA_size(publickey)]);
Run Code Online (Sandbox Code Playgroud)
如何将两个分配与新的 Qt 5 create 函数合二为一?
QSharedPointer<T> QSharedPointer::create()
Run Code Online (Sandbox Code Playgroud) 我目前有这样的事情
QSharedPointer<QMainWindow> cv;
Run Code Online (Sandbox Code Playgroud)
这个共享指针用作
cV = QSharedPointer<QMainWindow>(new QMainWindow(p));
cV->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);
cV->show();
Run Code Online (Sandbox Code Playgroud)
现在,如果我关闭,QMainWindow则以下代码会使应用程序崩溃
if(cV)
cV->close(); //This pointer is no longer valid.
Run Code Online (Sandbox Code Playgroud)
我的问题是当我关闭cV QMainWindow对象时(通过单击 的 x 按钮)为什么以下语句返回 true
if(cV)
Run Code Online (Sandbox Code Playgroud)
false如果窗口已关闭,我如何使其返回?
c++ ×12
qsharedpointer ×12
qt ×11
pointers ×4
shared-ptr ×4
boost ×2
containers ×1
qt4 ×1
qt5 ×1
qtcore ×1