标签: qsharedpointer

QSharedPointer作为方法参数或方法的返回值的良好实践?

关于如何使用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对象的变化.但是,我必须采取严格的方法吗?

c++ qt qsharedpointer

5
推荐指数
1
解决办法
766
查看次数

Qt智能指针相当于Boost :: shared_ptr?

Boost::shared_ptr在之前的项目中使用过,现在我想在Qt中找到一个智能指针,它做同样/类似的事情.由于Qt中有许多智能指针类,我想知道使用哪一个.是QSharedPointer吗?

c++ boost smart-pointers qt4 qsharedpointer

4
推荐指数
2
解决办法
2303
查看次数

使用带有new []的QSharedPointer会在valgrind中产生"mismatched free()/ delete/delete []"

我有以下代码:

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警告?

c++ qt smart-pointers qsharedpointer

4
推荐指数
1
解决办法
1844
查看次数

QSharedPointer,如何传递它们,我需要它们吗?

一直试图了解共享指针几天,感觉好像我似乎无法得到它.不确定它是否只是显而易见或是否过于复杂.首先,有人可以给我一个例子,你实际上会使用共享指针.维基百科上的例子对我来说毫无意义.如何将共享指针传递给另一个函数或使用共享指针创建一个对象.那么,你如何传递它,你会在哪里使用它?任何信息或示例都会很棒.

另外,我有这个问题,我不知道该用什么.我有这个函数,我分配一个QFile并将其传递给另一个类中的函数.该函数将文件作为a QIODevice*,然后创建包含该文件的对象.我想知道最好的解决方案是什么,以及如何(如果我应该)在这里使用共享指针?如何创建共享指针<QFile>并将其传递到函数所在的位置<QIODevice>.觉得我根本没有得到共享指针......

我的另一种方法是将分配QFile放入a QScopedPointer.然后我将它传递给类,当创建存储文件的对象时,我使用QPointerQScopedPointer.在第一个调用函数结束时,我应该调用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"抛出异常,我想要一种存储指针的方法以及在创建过程中处理它们的方法.

c++ qt pointers shared-ptr qsharedpointer

4
推荐指数
1
解决办法
1万
查看次数

QSharedPointer :: isNull()和operator!()之间的区别

在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

c++ qt shared-ptr qsharedpointer

3
推荐指数
1
解决办法
2730
查看次数

来自原始指针的QSharedPointer

我目前有这样的事情:

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)

c++ qt boost qtcore qsharedpointer

3
推荐指数
1
解决办法
2033
查看次数

只有Qt API中使用的普通指针

有一天我一直在和Qt一起工作,我想知道为什么他们所有的API都使用普通指针而不是他们自己的智能指针QSharedPointer.

使用它们会不会更加一致?

c++ qt qsharedpointer

3
推荐指数
2
解决办法
158
查看次数

设置 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.. 如何设置指针?

c++ qt qsharedpointer

2
推荐指数
2
解决办法
5884
查看次数

如何防止删除由QSharedPointer管理的指针

我在Qt应用程序中有一些间歇性的分段错误.我认为问题与我们(坏)的使用有关QSharedPointer.在Qt文档状态:

QSharedPointer :: QSharedPointer(T*ptr):创建一个指向ptr的QSharedPointer.指针ptr由此QSharedPointer管理,不得传递给另一个QSharedPointer对象在此对象外删除.

我想我们两个都不能 ......:/

是否有一种OOP方式来强制管理的指针QSharedPointer不能被删除或传递给另一个QSharedPointer

最好的解决方案是编译错误.

c++ qt pointers shared-ptr qsharedpointer

1
推荐指数
1
解决办法
2320
查看次数

如何以正确的方式从容器中删除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().

c++ qt containers shared-ptr qsharedpointer

1
推荐指数
1
解决办法
3890
查看次数

QSharedPointer::create()

在 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)

c++ qt pointers qt5 qsharedpointer

1
推荐指数
1
解决办法
3550
查看次数

QSharedPointer 不返回 false

我目前有这样的事情

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++ qt pointers qsharedpointer

1
推荐指数
1
解决办法
597
查看次数

标签 统计

c++ ×12

qsharedpointer ×12

qt ×11

pointers ×4

shared-ptr ×4

boost ×2

smart-pointers ×2

containers ×1

qt4 ×1

qt5 ×1

qtcore ×1