Errore Regex utilizzando MSVC 2013

Ho un pezzo di codice simile a xml per analizzare, usando std :: regex in MSVC 2013

 #version 450 core layout(location = 0) in vec3 pos; in VertexInfo{ vec2 uv; }vertexInfo; void main(){ gl_Position = vec4(pos, 1.0); vertexInfo.uv = pos.xy; }   #version 450 core layout(location = 0) uniform sampler2D g_map; uniform Color { vec4 color; }; layout(location = 0) out vec4 fragColor; void main(){ fragColor = texture(g_map, vertexInfo.uv); }  

Ecco lo schema:

 ((.|\n)+) 

Ma il programma si arresta sempre! C’è qualche bug nel mio regex? Ho provato su regex101.

PS. quando cancello la quinta linea:

 vec2 uv; 

funziona OK!

Si ottiene un’eccezione Stack overflow (parameters: 0x00000001, 0x00312FFC) quanto il pattern non è efficiente. Penso che sia correlato a come std::regex elabora gruppi ripetuti (ne hai definito uno con un gruppo + -quantifier (.|\n)+ ). Questo modello corrisponde a ogni carattere che non è una nuova riga ( . ), O una nuova riga ( \n ), e quindi memorizza la corrispondenza all’interno di un buffer. Quindi, un problema con il debug degli iteratori si verifica solo in modalità Debug . std::_Orphan_Me è il luogo in cui si verifica l’interruzione e viene considerato il metodo più “costoso” quando si confrontano le stringhe. Vedi il servizio di prestazioni killer-Debug Iterator in Visual Studio

Dovresti passare alla modalità Release o testare con un’espressione regolare che non richiede l’uso dei gruppi ripetuti, come qualsiasi carattere non nullo [^\x00] con quantificatore pigro *? :

 std::string str1 = "\n#version 450 core\nlayout(location = 0) in vec3 pos;\nin VertexInfo{\n vec2 uv;\n}vertexInfo;\nvoid main(){\n gl_Position = vec4(pos, 1.0);\n vertexInfo.uv = pos.xy;\n}\n\n\n#version 450 core\nlayout(location = 0) uniform sampler2D g_map;\nuniform Color {\n vec4 color;\n};\nlayout(location = 0) out vec4 fragColor;\nvoid main(){\n fragColor = texture(g_map, vertexInfo.uv);\n}\n"; std::regex reg1("([^\\x00]*?)"); std::smatch find1; if (std::regex_search(str1, find1, reg1)){ std::cout << find1[1].str(); } 

inserisci la descrizione dell'immagine qui