Это все правильно?
Ни один из примеров не верен.
char* dest = new char;
Вы выделили один char
. Единственная строка, которую он может представлять, - это пустая строка.
char* c = new char;
c = "Richard";
Назначив c
для указания на другое место, вы потеряли значение указателя, которое было возвращено new
, Как следствие, вы больше не можете передавать это значение в delete
. Это называется утечкой памяти.
Кроме того, начиная с C ++ 11 это плохо сформировано, поскольку строковые литералы больше не могут быть преобразованы в указатель на неконстантный символ. Плохая форма означает, что компилятор не требуется для компиляции вашей программы, и вместо этого он должен выдать вам сообщение о диагностике c, информирующее вас о неправильной форме.
strcpy_s(dest, strlen(c) + 1,c);
Вы должны передать размер буфера назначения; не размер исходных данных. В этом случае буфер назначения слишком мал, но поскольку вы передали неправильное значение, ошибка не обнаруживается и поведение не определено.
Как я уже говорил, передайте размер буфера назначения:
auto error = strcpy_s(dest, 1, "Richard");
Это безопасно приводит к ошибке вместо неопределенного поведения - или это может безопасно прервать программу или сделать что-то еще в зависимости от реализации. Вы можете управлять обработчиком ограничений, чтобы иметь желаемое поведение.
Конечно, вы можете выделить достаточно памяти для работы копии:
std::size_t destsz = 1024;
char* dest = new char[destsz];
Вы знаете размер, который вы выделили , Просто передайте это strcpy_s
:
auto error = strcpy_s(dest, destsz, "Richard");
Не забудьте очистить:
delete[] dest;
PS Стандартная библиотека C ++ не предоставляет strcpy_s
. Это нестандартная функция. Это стандартно только на C языке (но для реализации это необязательно).
PSS Не используйте new
для выделения строк. Используйте std::string
в C ++. С std::string
вы можете копировать следующим образом:
std::string c = "Richard";
std::string dest = c;
При таком подходе будет намного сложнее утечка памяти или более серьезные ошибки.