es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice std::string como búfer de salida para la función C.

Necesito utilizar una función C antigua que requiere un búfer de salida. En lugar de utilizar una matriz de caracteres para esto y luego copiar desde esta matriz de caracteres a std::string, quiero evitar la operación de copia adicional y utilizar un objeto str::string preasignado como búfer:

https://godbolt.org/z/jx85off3G

#include <string>
#include <cstring>
#include <iostream>

#define FF_MAX_LFN 255

void old_c_filler(char* s, int l) {
    strncpy(s, "abc", l);
}

int main() {
  std::string s(FF_MAX_LFN + 1, '\0');
  old_c_filler(s.data(), FF_MAX_LFN);
  s.resize(strnlen(s.c_str(), FF_MAX_LFN));
  s.shrink_to_fit();

  std::cout << s << '\n';
}

¿Es seguro hacerlo de esta manera?
Especialmente, ¿es seguro redimensionar de esta manera? (La redimensión es necesaria porque el tamaño de la cadena debe representar el tamaño real de la cadena C).

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no puedo proporcionar una respuesta definitiva sobre si este enfoque es seguro, pero puedo ofrecer algunas ideas sobre posibles preocupaciones:

    • Usar s.data() para obtener un puntero al búfer de caracteres subyacente del objeto std::string está permitido en C++11 y versiones posteriores, pero se debe usar con cautela porque el puntero puede volverse inválido cuando se modifica la cadena (por ejemplo, cuando se expande o se realloca).
    • La llamada a s.resize(strnlen(s.c_str(), FF_MAX_LFN)) asume que la cadena de estilo C copiada en el búfer está correctamente terminada con un carácter nulo y no incluye ningún carácter nulo incrustado que pueda hacer que strnlen devuelva una longitud incorrecta. Si la función de estilo C antigua no garantiza estas propiedades, el programa podría tener un comportamiento indefinido.
    • La llamada a s.shrink_to_fit() puede o no tener efecto dependiendo de la implementación de la clase std::string. No se requiere que se reduzca la capacidad de la cadena a su tamaño, por lo que es posible que la cadena aún tenga capacidad sobrante después de la llamada.

    En resumen, usar un objeto std::string preasignado como búfer para una función de estilo C antigua puede funcionar, pero requiere una consideración cuidadosa de posibles riesgos y detalles de implementación.

Comments are closed.