¿Es posible eliminar un objeto no nuevo?

Tengo un objeto con un vector de punteros a otros objetos, algo como esto:

class Object { ... vector objlist; ... }; 

Ahora, los Objetos se agregarán a la lista de las siguientes maneras:

 Object obj; obj.objlist.push_back(new Object); 

y

 Object name; Object* anon = &name; obj.objlist.push_back(anon); 

Si haces un destructor que es simplemente

 ~Object { for (int i = 0; i < objlist.size(); i++) { delete objlist[i]; objlist[i] = NULL; } } 

¿Habrá alguna consecuencia adversa en términos de cuándo intenta eliminar un objeto que no se creó con nuevo?

Sí, habrá efectos adversos.

No debe delete un objeto que no fue asignado con new . Si el objeto fue asignado a la stack, su comstackdor ya generó una llamada a su destructor al final de su scope. Esto significa que llamarás al destructor dos veces, con efectos potencialmente muy malos.

Además de llamar al destructor dos veces, también intentarás desasignar un bloque de memoria que nunca se asignó. El new operador presumiblemente coloca los objetos en el montón; delete espera encontrar el objeto en la misma región que el new operador les pone. Sin embargo, su objeto que no fue asignado con new vidas en la stack. Esto probablemente bloqueará tu progtwig (si no se cuelga después de llamar al destructor por segunda vez).

También te meterás en graves problemas si tu Object en el montón vive más tiempo que tu Object en la stack: obtendrás una referencia colgante en algún lugar de la stack, y obtendrás resultados incorrectos / locking la próxima vez que accedas eso.

La regla general que veo es que las cosas que viven en la stack pueden hacer referencia a cosas que viven en el montón, pero las cosas en el montón no deberían hacer referencia a cosas en la stack debido a las altas posibilidades de que sobrevivan a los objetos de la stack. Y los indicadores para ambos no deberían mezclarse.

No, solo puedes delete lo que ediaste

 Object* anon = &name; 

Cuando el nombre sale del scope, tendrá un puntero no válido en su vector.

Lo que realmente está preguntando es si es seguro eliminar un objeto no asignado a través del operador de delete y, de ser así, ¿por qué?

Desafortunadamente, esto está ofuscado por algunos otros problemas en tu código. Como se mencionó, cuando el nombre se sale del scope, terminará con un puntero no válido.

Consulte la respuesta de zneak para saber por qué su pregunta original no da como resultado una operación segura, y por qué el scope del nombre realmente importa.

Esto no funcionará: si delete un objeto que no fue asignado por new , ha violado las reglas o el operador de delete .

Si necesita que su vector almacene objetos que pueden o no necesitar ser eliminados, necesitará hacer un seguimiento de eso de alguna manera. Una opción es usar un puntero inteligente que realice un seguimiento de si el objeto apuntado es dynamic o no. Por ejemplo, shared_ptr<> permite especificar un objeto shard_ptr<> al construir el shard_ptr<> y a medida que los documentos mencionan:

Por ejemplo, un deallocator “no operativo” es útil al devolver un shared_ptr a un objeto asignado estáticamente

Sin embargo, debe tener cuidado al pasar punteros a las variables automáticas: si la vida útil del vector es más larga que la vida útil de la variable, en algún momento se referirá a la basura.