utilizar puntero programacion para libreria examples declarar como c++ winapi malloc

c++ - puntero - malloc() contra HeapAlloc()



puntero malloc (6)

Además, puede consultar:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs.85).aspx

Lo que significa que puede habilitar algunas características del HEAP administrado por el asignador de memoria WinApi, por ejemplo, "HeapEnableTerminationOnCorruption".

Según tengo entendido, hace algunas protecciones de desbordamiento de montón básicas que se pueden considerar como un valor agregado para su aplicación en términos de seguridad.

(Por ejemplo, preferiría bloquear mi aplicación (como propietario de la aplicación) en lugar de ejecutar código arbitrario)

Otra cosa es que podría ser útil en la fase inicial del desarrollo, por lo que podría detectar problemas de memoria antes de ir a la producción.

¿Cuál es la diferencia entre malloc () y HeapAlloc ()? Por lo que yo sé, malloc asigna memoria del montón, al igual que HeapAlloc, ¿verdad?

Entonces cuál es la diferencia?

¡Gracias!


Con Visual C ++, la función malloc() o el operador new eventualmente llama a HeapAlloc() . Si depura el código, encontrará que la función _heap_alloc_base() (en el archivo malloc.c ) llama a return HeapAlloc(_crtheap, 0, size) donde _crtheap es un heap global creado con HeapCreate() .

La función HeapAlloc() hace un buen trabajo para minimizar la sobrecarga de memoria, con un mínimo de 8 bytes de sobrecarga por asignación. El más grande que he visto es de 15 bytes por asignación, para asignaciones que van de 1 byte a 100.000 bytes. Los bloques más grandes tienen una sobrecarga mayor, sin embargo, como un porcentaje del total asignado sigue siendo inferior al 2.5% de la carga útil.

No puedo comentar sobre el rendimiento porque no he comparado el HeapAlloc() con una rutina personalizada, sin embargo, en cuanto a la sobrecarga de memoria de usar HeapAlloc() , la sobrecarga es increíblemente baja.


En realidad, malloc () (y otras funciones de montón C de tiempo de ejecución) dependen del módulo, lo que significa que si llama a malloc () en código desde un módulo (es decir, una DLL), debe llamar a free () dentro del código del mismo módulo o podría sufrir una corrupción de montón bastante mala (y esto ha sido bien documentado). Usar HeapAlloc () con GetProcessHeap () en lugar de malloc (), incluida la sobrecarga de operadores nuevos y eliminarlos para usarlos, le permite pasar objetos asignados dinámicamente entre módulos y no tener que preocuparse por la corrupción de la memoria si la memoria se asigna en el código de un módulo y liberado en el código de otro módulo una vez que el puntero a un bloque de memoria se ha pasado a un módulo externo.


Esto es lo que MS tiene que decir al respecto: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533(v=vs.85).aspx

Una cosa que uno mencionó hasta ahora es: "La función malloc tiene la desventaja de ser dependiente del tiempo de ejecución. El nuevo operador tiene la desventaja de ser dependiente del compilador y dependiente del idioma".

Además, "HeapAlloc puede ser instruido para generar una excepción si no se pudo asignar memoria"

Entonces, si quieres que tu programa se ejecute con cualquier CRT, o tal vez sin CRT, deberías usar HeapAlloc. Quizás solo las personas que harían tal cosa serían escritores de malware. Otro uso podría ser si está escribiendo una aplicación muy intensiva en memoria con patrones específicos de asignación / asignación de memoria que prefiere escribir su propio asignador de montón en lugar de usar un CRT.


Tiene razón en que ambos asignan memoria de un montón. Pero hay diferencias:

  • malloc() es portátil, parte del estándar.
  • HeapAlloc() no es portátil, es una función API de Windows.

Es muy posible que, en Windows, se implemente malloc encima de HeapAlloc . Esperaría que malloc sea ​​más rápido que HeapAlloc .

HeapAlloc tiene más flexibilidad que malloc . En particular, le permite especificar qué montón desea asignar. Esto abastece múltiples montones por proceso.

Para casi todos los escenarios de codificación usaría malloc lugar de HeapAlloc . Aunque desde que etiquetó su pregunta C ++, ¡espero que esté usando la new !


malloc es una función en la biblioteca estándar C (y también en la biblioteca estándar C ++).

HeapAlloc es una función API de Windows.

Este último le permite especificar el montón para asignar, lo que imagino que puede ser útil para evitar la serialización de solicitudes de asignación en diferentes hilos (tenga en cuenta el indicador HEAP_NO_SERIALIZE ).

Saludos y hth.,