Tôi có thư viện của bên thứ ba đang sử dụng char * (non-const) làm trình giữ chỗ cho các giá trị chuỗi. Cách đúng và an toàn để gán các giá trị cho các kiểu dữ liệu đó là gì? Tôi có benchmark thử nghiệm sau đây có sử dụng lớp hẹn giờ của riêng tôi để đo thời gian thực hiện:Cách thích hợp để xử lý các chuỗi char * là gì?
#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;
}
Output:
creating c-strings unsafe(?) way...
1.9164 ns
creating c-strings safe(?) way...
31.7406 ns
Trong khi "an toàn" cách get của thoát khỏi trình biên dịch cảnh báo nó làm cho mã về 15-20 lần chậm hơn theo điểm chuẩn này (1,9 nano giây mỗi lần lặp lại và 31,7 nano giây mỗi lần lặp). Cách chính xác và những gì là rất nguy hiểm về cách "không được chấp nhận"?
Ai sẽ giải phóng bộ nhớ trong trường hợp an toàn? Thư viện của bên thứ 3 được thiết kế kém, thành thật mà nói. –
Nếu bạn định sao chép vào bộ đệm tạm thời, ít nhất hãy sử dụng 'vector'. –
* Ngoài *: 'new char [strlen (" teststr ") + 1]' để tránh viết NUL char bên ngoài bộ đệm. –