2016-06-09 6 views
0

Я пытаюсь использовать QTextStream для чтения с QString. Так как конструктор имеет следующую подпись:Собственность QString с QTextStream

QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite) 

(см the documentation)

Так как конструктор передается сырой указатель, я задаюсь вопросом, если QTextStream становится владельцем QString или если я должен управлять ею мой код, чтобы убедиться, что объект QString удален после объекта QTextStream.

Я не нашел никакой информации об этом ни в документации, ни в поисковых системах (например, google, duckduckgo). Все примеры, которые я нашел, показывают QString и QTextStream, которые имеют одинаковое время жизни (локальные переменные в одной и той же функции), поэтому я не уверен, что произойдет, если два объекта имеют разные сроки жизни.

+1

Я не использовал 'QTextStream', используя этот конкретный конструктор. Однако, я думаю, что объект 'QTextStream' просто использует' QString' для чтения или записи. Он не принимает на себя ответственность за 'QString'. –

ответ

3

QTextStream не берет на себя ответственность перед лицом QString.

На самом деле вы можете написать функцию, как это:

void test() 
{ 
    QString s; 
    QTextStream ts(&s); 
    ///..... 
} 

Если QTextStream берет собственность, в этом случае QString будет удален в два раза, и будет ошибка времени выполнения. Но этот код является правильным, поэтому QTextStream не принимает в собственность

3

Если документация не специально утверждают, что QTextStream объект принимает собственность, это довольно безопасно предположить, что это не так. В противном случае это было бы довольно неприятное упущение.

Но если вы не доверяете документации, чтобы сообщить вам, у вас есть два ресурса: прочитайте source code или проверьте поведение в коде.

Как оказалось, QTextStream не принимает на себя ответственность и никогда не попытается удалить QString*. Это ставит вопрос о том, почему параметр не объявлен как const QString*, но это целый другой вопрос.

Я рекомендую вам написать единичный тест, если вы хотите 100% гарантию. Хотя крайне маловероятно (в конце концов, это не PHP), вполне возможно, что поведение изменится в более поздней версии.

+0

Причина, по которой это не 'const', заключается в том, что в него также может записываться' QTextStream': 'stream << 2; // строка теперь будет содержать «2». – coyotte508

+0

«Это ставит вопрос о том, почему параметр не объявлен как const QString *» - потому что вы можете написать ему. – Murphy

+0

Ах, конечно. Не понял, что это контейнер для чтения и записи. Благодарю. – nephtes