2010-10-06 8 views
10

Duplicar posible:
c++ warning: address of local variabledirección de retorno o una advertencia variable local o temporal C++

Hola, Cuando escribo este código:

//Returns the transpose matrix of this one 
SparseMatrix& SparseMatrix::transpose()const{ 
    vector<Element> result; 
    size_t i; 
    for(i=0;i<_matrix.size();++i){ 
     result.push_back(Element(_matrix.at(i)._col, _matrix.at(i)._row, _matrix.at(i)._val)); 
    } 

    return SparseMatrix(numCol,numRow,result); 
} 

me sale el aviso "dirección de retorno o variable local o temporal". La última línea llama al constructor SparseMatrix. No entiendo qué está mal con este código, y cómo puedo solucionarlo para que pueda devolver un objeto SparseMatrix como yo quiera.

Respuesta

12

usted está volviendo una referencia, no un objeto real - tenga en cuenta el & aquí:

SparseMatrix& SparseMatrix::transpose()const{ 

Si desea devolver el objeto real, eliminar esa &.

La última línea llama al constructor, pero no devuelve el objeto resultante. Ese objeto se destruye inmediatamente y se devuelve una referencia no válida.

+2

+1 ¡Aquí el "&" es inútil (de hecho erróneo)! – kartheek

+0

gracias! No me he dado cuenta que lo he declarado como un valor de retorno de la referencia. – limlim

10

En C++, las variables locales se destruyen "automáticamente" al salir del ámbito. Su instrucción return creará una variable temporal anónima de tipo SparseMatrix que saldrá inmediatamente del alcance. Por lo tanto, devolver una referencia no tiene sentido.

Puede ser más fácil devolver por valor: luego se devolverá una copia del temporal. El compilador puede optimizar eso (copia elisión).

Si realmente desea pasar un objeto fuera de una función, debe crearla en el montón, utilizando new:

SparseMatrix* SparseMartix::transopse()const{ 


    //... 
    return new SparseMatrix(...); 

} 

Pero entonces, tiene que cuidar de la vida útil del objeto devuelto tú mismo.

0

El constructo 'T()' crea un temporal de tipo 'T' que básicamente no es un valor L (sino un valor R).

$ 12,1/11 - "Un tipo de notación funcional conversión (5.2.3) se puede utilizar para crear nuevos objetos de su tipo [ Nota: La sintaxis es un llamada explícita del constructor..

12 Un objeto creado de esta manera no tiene nombre. [nota: 12.2 describe la vida de> objetos temporales -fin nota.] [nota: explícita llamadas a constructores no dió lvalues, ver nota 3.10 -fin.] La duración de este temporal es el final de la expresión completa, es decir, el punto y coma final después de la expresión.

$ 12,2/3 - "objetos temporales son destruidos como el último paso en la evaluación de la expresión completa (1.9) que (léxico) contiene el punto donde fueron creadas. Esto es verdadero incluso si esa evaluación termina en lanzando una excepción.El valor cálculos y efectos secundarios de destruyendo un objeto temporal se asociado sólo con el -expresión completa, no con cualquier subexpresión específica ".

$ 12,2/5- 'El tiempo de vida de un temporal unido a la el valor devuelto en una declaración de devolución de función (6.6.3) es no extendido; el temporal es destruido al final de la expresión completa en la declaración de devolución ".

Por lo tanto, su función intenta devolver una referencia a una ubicación de memoria cuya duración de almacenamiento ya ha finalizado y el objeto ha sido destruido.

Por lo tanto, una advertencia. Tenga en cuenta que esta situación no es obligatoria para ser diagnosticada explícitamente por el estándar y, por lo tanto, es una advertencia.

Cuestiones relacionadas