estoy teniendo una situación extraña. Estoy tratando de implementar un SDK de dispositivo de cámara pci de más de 10 años en mi software de administración de la cámara. Manifacturer ya no está en el negocio y no tengo ninguna posibilidad de obtener ayuda oficial. Así que aquí estoy, buscando alguna ayuda para mi feo problema.Diferente comportamiento de memoria sin asignar entre versiones de Visual Studio
SDK viene con Visual Studio 6.0
muestras. Uno de los archivos de inclusión tiene una estructura que termina con una matriz de un byte como a continuación;
typedef struct AVData {
...
BYTE audioVideoData[1];
}AVDATA, *PAVDATA;
Pero este único octeto asignado matriz de bytes recibe tramas de vídeo y bastante raro, que funciona bien con la versión de Visual Studio 6.0. Si lo intento con Visual Studio 2005/2008/2010, empiezo a recibir mensajes de error Memory Access Violation
, lo que realmente tiene sentido ya que después no se puede asignar espacio a una matriz de tamaño fijo, ¿no? Pero el mismo código funciona bien con VS 6.0 ?! Probablemente sea causado por el compilador o las diferencias de tiempo de ejecución de C++, pero no tengo mucha experiencia en este tema, por lo que es difícil decir la razón cierta para mí.
Intenté cambiar el tamaño a un número máximo de bytes esperado como el siguiente;
typedef struct AVData {
...
BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;
Esto le ayudó a conseguir trabajo, pero de vez en cuando me sale de memoria problemas de infracción de acceso cuando se trata de destruir el objeto decodificador de la biblioteca.
Hay algo definitivamente malo en esto. No tengo los códigos fuente del SDK, solo los archivos DLL, Lib y Header. Mis preguntas son:
1) ¿Es realmente legal asignar espacio a una matriz de tamaño fijo en la versión de Visual Studio 6.0?
2) ¿Hay alguna manera posible (una opción del compilador, etc.) de hacer que el mismo código funcione con versiones VS más recientes/tiempos de ejecución C++?
3) Debido a que mi forma de editar el archivo de encabezado funciona hasta cierto punto pero aún tengo problemas, ¿conoce alguna forma mejor de solucionar este problema?
supongo que el problema debe estar en otro lugar. El tamaño de la matriz no debería ser un problema aquí, no es la intención de ser un límite superior. – BlueWanderer
Se llama una matriz flexibles: http://stackoverflow.com/questions/5478706/flexible-array-member-c99-inside-a-structure –
Pero, ¿por qué obtenemos la Violación de acceso de memoria, entonces? Si creo un nuevo objeto a partir de esta estructura, ¿no se crearía con el tamaño de 1 (+ resto de los elementos de la estructura)? Entonces, ¿cómo podemos almacenar más de un byte a la matriz audioVideoData después? ¿Es posible reasignar memoria a una matriz de tamaño fijo? Dado que funciona con la versión VS 6.0, podría ser posible antes, pero ¿qué pasa con VS 2005+? –