У меня есть сторонняя библиотека, которая использует char * (не const) в качестве заполнителя для строковых значений. Каков правильный и безопасный способ присвоения значений этим типам данных? У меня есть следующий тест тест, который использует свой собственный класс таймера для измерения времени выполнения:Каков правильный способ обработки символов 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;
}
Выход:
creating c-strings unsafe(?) way...
1.9164 ns
creating c-strings safe(?) way...
31.7406 ns
В то время как «безопасный» способ прибудет-х избавиться от компилятора предупреждения он делает код о В соответствии с этим эталоном в 15-20 раз медленнее (1,9 наносекунды на итерацию против 31,7 наносекунд на итерацию). Каков правильный путь и что опасно для этого «устаревшего» способа?
Кто собирается освободить память в сейфе? Честно говоря, сторонняя библиотека плохо разработана. –
Если вы собираетесь копировать во временный буфер, по крайней мере используйте 'vector'. –
* Помимо *: 'new char [strlen (" teststr ") + 1]', чтобы избежать записи символа NUL за пределами буфера. –