Ho riscontrato una violazione di accesso quando si utilizza un QString in un elenco di inizializzazione che non capisco.QString nella lista di inizializzazione causa una violazione di accesso. Cosa va storto qui?
Ecco un esempio minimo che riproduce il problema.
// file ClassA.h
#pragma once
#include <QString>
struct Parameter
{
QString stringPar;
};
class ClassA
{
QString m_string1;
public:
void function(Parameter pars);
};
Attuazione ClasseA ...
// file ClassA.cpp
#include "ClassA.h"
void ClassA::function(Parameter pars)
{
m_string1 = pars.stringPar; // last line called in my code when the crash happens
}
e main.cpp
// file main.cpp
#include "ClassA.h"
int main()
{
ClassA classA;
classA.function({ QString("jkjsdghdkjhgdjufgskhdbfgskzh") });
// when using this code the problem does not occur
//Parameter par = { QString("jkjsdghdkjhgdjufgskhdbfgskzh") };
//classA.function(par);
return 0;
}
Lo stack di chiamate al momento della violazione:
Qt5Cored.dll!QGenericAtomicOps<QAtomicOpsBySize<4> >::load<long>(const long & _q_value) Line 96
Qt5Cored.dll!QBasicAtomicInteger<int>::load() Line 142
Qt5Cored.dll!QtPrivate::RefCount::ref() Line 57
Qt5Cored.dll!QString::operator=(const QString & other) Line 1355
EducationalCode.exe!ClassA::function(Parameter pars) Line 6
EducationalCode.exe!main() Line 8
Qualcosa sembra sbagliare con l'assegnazione della copia i n ClassA :: function() ma non sono sicuro di cosa sia. Quando cambio la firma di funzione da
function(const Parameter& pars);
che non va in crash neanche.
Avete qualche idea?
non sembra che dovrebbe bloccarsi ... e non è precipitato su di me (Qt5.3, gcc4.8.2, kubuntu a 32 bit). Quale compilatore, versione di Qt, OS, ecc.? – HostileFork
Windows 7 64 bit, Visual Studio 2013 con Update 2, Qt 5.1.1 – Knitschi
Se si cambia 'QString' in' std :: string' funziona? – cmannett85