Ho una libreria di terze parti che utilizza char * (non-const) come segnaposto per i valori stringa. Qual è il modo giusto e sicuro per assegnare valori a questi tipi di dati? Ho il seguente parametro di riferimento di test che utilizza la mia classe timer per misurare i tempi di esecuzione:Qual è il modo giusto per gestire le stringhe char *?
#include "string.h"
#include <iostream>
#include <sj/timer_chrono.hpp>
using namespace std;
int main()
{
sj::timer_chrono sw;
int iterations = 1e7;
// first method gives compiler warning:
// conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
cout << "creating c-strings unsafe(?) way..." << endl;
sw.start();
for (int i = 0; i < iterations; ++i)
{
char* str = "teststring";
}
sw.stop();
cout << sw.elapsed_ns()/(double)iterations << " ns" << endl;
cout << "creating c-strings safe(?) way..." << endl;
sw.start();
for (int i = 0; i < iterations; ++i)
{
char* str = new char[strlen("teststr")];
strcpy(str, "teststring");
}
sw.stop();
cout << sw.elapsed_ns()/(double)iterations << " ns" << endl;
return 0;
}
uscita:
creating c-strings unsafe(?) way...
1.9164 ns
creating c-strings safe(?) way...
31.7406 ns
Mentre il "sicuro" modo di eliminare l'avviso del compilatore rende il codice su Get 15-20 volte più lento secondo questo benchmark (1,9 nanosecondi per iterazione vs 31,7 nanosecondi per iterazione). Qual è il modo corretto e cosa sono così pericolosi in questo modo "deprecato"?
Chi ha intenzione di liberare la memoria nel caso sicuro? La libreria di terze parti è mal progettata, a dire il vero. –
Se stai per copiare in un buffer temporaneo, almeno usa un 'vector'. –
* A parte *: 'new char [strlen (" teststr ") + 1]' per evitare di scrivere il carattere NUL all'esterno del buffer. –