Me gustaría utilizar un estándar :: vector para controlar una pieza determinada de memoria. En primer lugar, estoy bastante seguro de que no es una buena práctica, pero la curiosidad me ha superado y me gustaría saber cómo hacer esto de todos modos.contrucción de vector de C++ con memoria dada
El problema que tengo es un método como este:
vector<float> getRow(unsigned long rowIndex)
{
float* row = _m->getRow(rowIndex); // row is now a piece of memory (of a known size) that I control
vector<float> returnValue(row, row+_m->cols()); // construct a new vec from this data
delete [] row; // delete the original memory
return returnValue; // return the new vector
}
_m es una clase de interfaz de DLL que devuelve una matriz de flotador que es la responsabilidad de las personas que llaman a eliminar. Así que me gustaría envolver esto en un vector y devolverlo al usuario ... pero esta implementación asigna nueva memoria para el vector, la copia, y luego elimina la memoria devuelta, luego devuelve el vector.
Lo que me gustaría hacer es decir directamente al nuevo vector que tiene control total sobre este bloque de memoria para que cuando se elimine se limpie la memoria.
ACTUALIZACIÓN: La motivación original para este (memoria de regresar de una DLL) ha sido bastante firmemente aplastada por un número de respondedores :) Sin embargo, me gustaría saber la respuesta a la pregunta de todos modos ... Es Hay una forma de construir un std :: vector usando un trozo dado de memoria preasignada T * array, y el tamaño de esta memoria?
El código publicado provoca un comportamiento indefinido cuando se llama a 'eliminar fila' si la memoria se asignó con' nuevo [] 'o' malloc' –
No creo que pueda darle un 'vector' a un pedazo de memoria porque 'vector' necesita ser capaz de asignar y desasignar a voluntad a medida que cambia la capacidad del' vector'. En esta situación, eso requiere conocimiento de cómo su DLL asigna/desasigna memoria, que por supuesto no debería ser información requerida para trabajar con una interfaz DLL adecuada. –
@ChrisDodd, el error está corregido. @Insilico No me importa si desasigna y reasigna esta memoria ... Solo quiero poder decir "Comience a usar esta pieza de memoria" –