你怎么看?这是正确的还是有内存泄漏?
资源:
#include <QList.h>
#include <boost/shared_ptr.hpp>
#include <iostream>
class A {
private:
int m_data;
public:
A(int value=0) { m_data = value; }
~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; }
operator int() const { return m_data; }
};
int _tmain(int argc, _TCHAR* argv[])
{
QList<boost::shared_ptr<A> > list;
list.append(boost::shared_ptr<A>(new A(6)));
std::cout << int(*(list.at(0))) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
6
destroying A(6)
Run Code Online (Sandbox Code Playgroud) 请确认我是否正确并告诉我是否有更好的解决方案:
我理解具有常量成员的对象int const width;不能由编译器隐式创建的合成赋值运算符处理.但是QList(我想std :: list)也需要一个工作赋值运算符.因此,当我想使用具有常量成员和QList的对象时,我有三种可能性:
那是对的吗?还有其他优雅的解决方案?
我也想知道我是否可以:
编辑:我自己从不分配这个类的对象.它们仅由复制构造函数或重载的构造函数创建.因此,只有容器才需要赋值操作符而不是我自己.
EDIT2:这是我创建的赋值运算符.我不确定它是否正确.Cell有两个参数构造函数.这些参数使用初始化列表设置两个常量成员.但该对象还包含其他变量(非常量)成员.
Cell& Cell::operator=(Cell const& other)
{
if (this != &other) {
Cell* newCell = new Cell(other.column(), other.row());
return *newCell;
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
EDIT3:我发现这个帖子几乎有同样的问题:C++:STL麻烦与const类成员所有答案结合在一起回答了我的问题.
我试图在XCode中调试一些Qt容器,我从GDB返回的结果没用:
print l1
$1 = (QSharedPointer<QList<SNAPSHOT> > &) @0x102780650: {
<QtSharedPointer::ExternalRefCount<QList<SNAPSHOT> >> = {
<QtSharedPointer::Basic<QList<SNAPSHOT> >> = {
value = 0x1161e47e0
},
members of QtSharedPointer::ExternalRefCount<QList<SNAPSHOT> >:
d = 0x1161ace00
}, <No data fields>}
Current language: auto; currently c++
(gdb) print strQuery
$2 = {
d = 0x1161e2890
Run Code Online (Sandbox Code Playgroud)
如何从l1(QList)和strQuery(QString)获得一些有用的输出?
我已经尝试过使用这个.gdbinit,它添加了一些像"printq4string"这样的宏,但是这些使用非常痛苦,因为在打印结构时我需要在每个成员变量上手动运行它.
我有一个QList组成QVector3D。AQVector3D代表一个顶点或一个点。此 List 还包含 a 的所有顶点STL-File。问题是一个顶点在列表中多次存在。需要一个 STL 文件的唯一顶点列表。我该如何实现它Qt 5.0.2?
是否有一种简单的方法可以将QList<Class*>新的QList中的位置a 复制到b?
我测试过:
QList<Class*> newList(list.begin()+5,list.end());
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我收到错误:"没有匹配的电话...."
有人能帮我吗?
问候
我有一个充满动态创建对象的Qlist。在终止程序之前,我先调用myqlist.clear()
我的问题是:这还会删除(释放)列表中包含的对象吗?Valgrind给了我一些丢失的块,我想知道我是否误解了qlist clear方法的工作方式。
或者,我是否需要遍历qlist并删除每个对象?
更新:我可以确认mylist.erase(iterator)正在从列表中删除该项目,但没有释放动态分配的对象。(该对象是一个动态实例化的类)。很奇怪!我从Qlist切换到QLinkedList,但结果相同。记住,我的QLinkedList是QLinkedList <myclass>而不是QLinkedList <* myclass>
这是实际的代码,以防有人发现我在做错什么:
// Here I define a couple important items. Note that AMISendMessageFormat is a class
typedef QLinkedList<AMISendMessageFormat> TSentMessageQueue;
TSentMessageQueue m_sentMessageQueue;
// Here I create the message and append to my QLinkedList
AMISendMessageFormat *newMessage = new AMISendMessageFormat(messageToSend);
m_sentMessageQueue.append(*newMessage);
// Here I delete
for (TSentMessageQueue::Iterator sMessagePtr = m_sentMessageQueue.begin(); sMessagePtr != m_sentMessageQueue.end(); )
{
sMessagePtr = m_sentMessageQueue.erase(sMessagePtr);
qDebug() << "Sent size after erase: " << m_sentMessageQueue.size(); // Confirmed linked list is shrinking in size
} …Run Code Online (Sandbox Code Playgroud) 有没有人遇到过QList的最大尺寸?
我有一个指向我的对象的指针的QList,并且发现当它到达268,435,455项(它正好是28位)时它会默默地抛出一个错误.我原以为它至少有一个31位的最大大小(减去一位因为size()返回有符号整数),或者我的64位计算机上最大大小为63位,但事实并非如此.我通过QList<void*> mylist; mylist.append(0);在计数循环中执行来在最小的例子中证实了这一点.
要重申这个问题,QList的实际最大大小是多少?如果它实际上不是2 ^ 32-1那么为什么呢?有解决方法吗?
我正在为MSVC2010运行Qt 4.8.5的Windows 64位版本.
我正在尝试根据 QDateTime 对 QList 进行排序,但出现以下错误:
must use '.*' or '->*' to call pointer-to-member function in 'lessThan (...)', e.g. '(... ->* lessThan) (...)'
if (lessThan(*end, *start))
^
Run Code Online (Sandbox Code Playgroud)
排序功能:
bool sortRecord(Record left, Record right){
return left.getArrival().getDate() < right.getArrival().getDate();
}
Run Code Online (Sandbox Code Playgroud)
函数是这样调用的:
qSort(recordList.begin(), recordList.end(), sortRecord);
Run Code Online (Sandbox Code Playgroud)
Record 中到达的 getter 和 setter:
void Record::setArrival(Arrival arrival){
this->arrival = arrival;
}
Arrival Record::getArrival(){
return this->arrival;
}
Run Code Online (Sandbox Code Playgroud)
getDate() 到达功能:
QDateTime Arrival::getDate(){
QDateTime qDateTime;
QDate qDate;
qDate.setDate(date.getDateYear(), date.getDateMonth(), date.getDateDay());
qDateTime.setDate(qDate);
vector<string> timeS = splitTime(time.getTimeFrom());
QTime qTime;
qTime.setHMS(stoi(timeS[0]), stoi(timeS[1]), 0);
qDateTime.setTime(qTime); …Run Code Online (Sandbox Code Playgroud) 这个问题更多的是一种询问,而不是实际寻求问题的解决方案。
QList::at()不仅不检查索引是否越界,而且还返回 aconst因此它只能在以下场景中使用read-only:
const T &QList::at(int i) const
返回列表中索引位置 i 处的项目。i 必须是列表中的有效索引位置(即,0 <= i < size())。
这个函数非常快(恒定时间)。
我刚刚在尝试为列表中的元素分配新值时发现了这些特殊的实现细节QList,我想知道是否有这样做的理由。
如果C++ STL我们采取std::array或std::vector(我不采取std::list,因为它根本没有std::list::at()),我们有以下内容:
std::向量::at
该函数自动检查 n 是否在向量中有效元素的范围内,如果不在则抛出 out_of_range 异常
起初我以为不包括检查是为了确保“这个功能非常快(恒定时间)”。然而,在查看了实现之后,QList我不得不说,即使包含恒定时间(并且高速)的检查,也绝对可以保证。
检查越界需要两件事(据我所知):
O(1)如果我们使用一些古怪的符号)。显然我们不能有负索引(我们可以,Python但它有另一个含义;))检查给定索引是否< QList::size()- 常数时间也存在于此,因为QList::size()实现方式是:
inline int size() const Q_DECL_NOTHROW { return d->end - d->begin; }
Run Code Online (Sandbox Code Playgroud)
这又是O(1)(如果我没记错的话),因为这两个值都存储在QList::d参数内,该参数是指向 …
我正在尝试使用QList创建一个对象列表,但是当我尝试添加到列表时出现错误.如果我使用QString作为对象,它可以工作,但如果我使用TestClass则不行.
更新了有效的main.cpp.这是正确的做事方式吗?
#include <QCoreApplication>
#include <QDebug>
#include "testclass.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<TestClass*> test_list;
TestClass* test_1 = new TestClass;
test_1->test_varialbe = 1;
test_list.append(test_1);
TestClass* test_2 = new TestClass;
test_2->test_varialbe = 2;
test_list.append(test_2);
foreach(TestClass* t, test_list) {
qWarning() << t->test_varialbe;
}
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include <QCoreApplication>
#include "testclass.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<TestClass> test_list;
TestClass test;
test_list.append(test);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
testclass.h
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include <QObject>
class TestClass : …Run Code Online (Sandbox Code Playgroud)