Crear nuevos objetos de C++ en específico de la dirección de memoria?

Es posible en C++ para crear un nuevo objeto en una ubicación de memoria específica? Tengo un bloque de memoria compartida en la que me gustaría crear un objeto. Es esto posible?

InformationsquelleAutor Chris | 2009-10-12

5 Kommentare

  1. 61

    Desea la colocación de nuevo(). Básicamente se llama al constructor con un bloque de memoria existente en lugar de asignar la nueva memoria del montón.

    Edición: asegúrese de que usted entiende la nota acerca de ser responsable de llamar al destructor de forma explícita para los objetos creados mediante la colocación de new() antes de usarlo!

    • Gracias por una buena respuesta para una buena pregunta. He aprendido algo nuevo hoy. Yo habría terminado fanangling C construcciones en cpp mundo para llevar a cabo esto.
    • +1 para especificar que el Destructor tiene que ser llamados, normalmente, no importa, pero cuando tiene efectos secundarios además de la liberación de la memoria…
    • Te recomiendo la lectura de todos de Marshall Cline C++ FAQ Lite varias veces. Es un recurso de valor incalculable.
    • Por desgracia, la articile que punto es erróneo y equivocado. El uso de una matriz de char como que no es una buena idea. El problema es que una matriz declarada como que no tiene garantizada la alineación. Lo que usted necesita hacer es utilizar un vector<char> Porque la memoria asignada dinámicamente la memoria será correctamente aliagened (iff el espacio asignado es igual o mayor que el tamaño del objeto (Echa un vistazo a la alighment propiedades de nuevo en el estándar))
    • interesante… voy a tener que cavar en que uno. Curiosamente, la Norma utiliza el mismo ejemplo en la cláusula 4 de 18.4.1.3. A continuación, de nuevo, el ejemplo de la Norma carece de la necesaria yeso para void*… oh bien.
    • Yo recomiendo no leer las preguntas más frecuentes en serio. Es serioulsy deficiente en muchos lugares, y a menudo está en desacuerdo con las comúnmente aceptadas como las mejores prácticas adoptadas por Sutter/Alexandrescu y Meyers.
    • Tu comentario acerca de la alineación es ya se ha señalado en las preguntas frecuentes, aunque sin la mención de std::vector.
    • Que hay de nuevo. En lugar de decir que es peligroso, ¿por qué no describir un método que está garantizado para trabajar! La solución es tan simple como la versión en el FAQ (como es realmente muy fácil (uso de la memoria dinámica (Un vector de ser sólo un ejemplo)).
    • Sé que esto es muy antiguo comentario, pero para los futuros lectores: no intente crear un std::vector en la memoria compartida sin necesidad de utilizar un asignador personalizado y saber realmente lo que están haciendo.
    • 18.6.1.3 en el estándar de 2011 año.
    • El enlace esta roto 🙁
    • ¿STL uso esta en que la aplicación de emplace?

  2. 12

    Sí. Usted necesita utilizar para la colocación de la variante de operator new(). Por ejemplo:

    void *pData = ....; //memory segment having enough space to store A object
    A *pA = new (pData) A;

    Por favor, tenga en cuenta que la colocación de nuevo no se lanza una excepción.

    • hay alguna forma de hacer algo como placement new en tiempo de compilación?
  3. 1

    si desea asignar una gran cantidad de grano fino de los objetos, la mejor manera será utilizar la colocación de nuevo en conjunción con algún tipo de un búfer de anillo. de lo contrario, usted tendrá que seguir la pista de los punteros aparte de los punteros de objeto a sí mismos.

  4. 0

    Suponiendo que se tiene un puntero a la ubicación de memoria que usted está queriendo colocar un objeto en, creo que uno puede convertir el puntero a un tipo nuevo y, a continuación, coloque un objeto en la ubicación del puntero. Esta es una solución que no requiere nueva().

    Dado su memoria:

    //you would use the pointer you have to your allocation of memory
    char* mem_start = new char[1024]; //Now we have 1024 bytes to play with

    Uno puede echar a un tipo determinado:

    CustomType* object_ptr = (CustomType*) mem_start;

    Por último, usted puede construir un objeto no:

    *(object_ptr) = CustomType();

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea