19
Desayunos Técnicos Trampas en C++

Trampas en c ++

  • Upload
    dtq4

  • View
    549

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Trampas en c ++

Desayunos Técnicos

Trampas en C++

Page 2: Trampas en c ++

Desayunos Técnicos

Trampas en C++

"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg."

Bjarne Stroustrup

¿Qué es C++?• C++ es un lenguaje de programación diseñado a

mediados de los 80 por Bjarne Stroustrup.• Lenguaje de programación muy popular, solo por

detrás de Java y C.• El código que compila en C++ no tiene por qué ser

correcto.

Page 3: Trampas en c ++

Desayunos Técnicos

Trampas en C++

¿Trampas en C++?• C++ esconde una gran cantidad de trampas, es

complejo y a menudo los errores se encuentran muy escondidos.

• El desayuno técnico propondrá a los participantes un juego en grupos para descubrir algunas trampas de C++. Se plantea una trampa en C++, a continuación se

presentan una serie de respuestas posibles en modo ‘múltiple elección’.– Opción1– Opción2– Opción3– Opción4Bjarne Stroustrup nos ilustra con aclaraciones correctas y fallos típicos

• Opción correcta Nº2: Explicación al problema• Moraleja: Fallos típicos ante este tipo de problema.

Page 4: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR1 – Nivel 1void main()

{

   char *s = "hola!";

   s[0] = 'm';

   printf("%s\n", s);

}

¿Cuál será la salida del programa?1) Error de compilación.2) hola!3) Error de ejecución.4) mola!

Page 5: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR1 – Nivel 1Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº3: La variable local “s” es un puntero, no

un string. El compilador utiliza “hola” como un string constante, lo aloca en memoria read-only.

• Moraleja: Utilizar “char s[]” en vez de “char *s”.

3!

Page 6: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR2 – Nivel 1class A1 {

virtual ~A1() { printf("A1,"); } };class A2 {

~A2() { printf("A2,");}};class B1 : public A1 {

~B1() { printf("B1,");}};class B2 : public A2 {

~B2() { printf("B2,");} };

B1* b1 = new B1(); delete b1;B2* b2 = new B2(); delete b2;A1* ab1 = new B1(); delete ab1;A2* ab2 = new B2(); delete ab2;

¿Cuál será la salida del programa?1) B1, B2, A1, A2,2) B1, A1, B2, A2, B1, A1, B2,

A2,3) B1, A1, B2, A2, B1, A1, A2,4) B1, A1, B2, A2, A1, A2,

Page 7: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR2 – Nivel 1Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº3: Solo si el destructor es virtual destruir

a través de un puntero clase base destruirá los miembros de la clase derivada.

• Moraleja: Si una clase está pensada para derivar de ella deberá tener, al menos, un destructor virtual.

3!

Page 8: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR3 – Nivel 1struct MyStruct {

int array[4];

int n1;

int n2;

};

int main() { 

MyStruct str;

str.n1 = 10;

str.n2 = 20; 

str.array[3] = 3;

str.array[5] = 5;

printf("%d\n",str.n1);

printf("%d\n",str.n2);

printf("%d\n",str.array[3]);

printf("%d\n",str.array[5]);

}

¿Cuál será la salida del programa?1) Error de compilación2) 10, 5, 3, 53) Error en tiempo de ejecución4) 10, 20, 3, 55) 10, 20, 3, Basura (variable sin

inicializar)

Page 9: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR3 – Nivel 1Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº2: Utilizar índices de arrays es como

utilizar punteros. Se accede a “lo que toque” en esa memoria.

• Moraleja: Nadie (compilador, runtime) pone límites a los array. Mucho cuidado al utilizarlos.

2!

Page 10: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR4 – Nivel 1void main() {

int *array = getArray();

printf(“%d\n",array[0]);

algoritmo();

printf("%d\n",array[0]);

}

int *getArray() {

int a[3] = {1, 2, 3};

printf("%d\n", a[0]);

return a;

}

void algoritmo() {

int datos[10] = {11,12,13,14,15,16,17,18,19,20};

int n = datos[2] + datos[3] * datos[7];

printf("blah blah blah \n");

}

¿Cuál será la salida de este programa?1) 1, ‘INDEFINIDO’, blah blah blah,

‘INDEFINIDO’2) 1, ‘INDEFINIDO’, blah blah blah, 13) Error en tiempo de ejecución4) 1, 1, blah blah blah, 15) 1, 1, blah blah blah, ‘INDEFINIDO’

Page 11: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR4 – Nivel 1Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº5: Los valores quedan en un principio en

memoria, pero los puede sobrescribir alguna otra función que utilice esa región del stack.

• Moraleja: Nunca devolver punteros o arrays locales.

5!

Page 12: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR5 – Nivel 1

¿Cuál será la salida del programa?1) 1, 1, 1, 1, 1, 12) 0, 0, 0, 0, 0, 03) 0, 0, 1, 1, 0, 04) 0, 0, 1, 1, 1, 1

struct Point { int x, y; };struct Data { Point point;

Point *ppoint;int array[2]; };

void main() {Point p = {0,0};Data d1,d2;d1.point.x = 0;d1.point.y = 0;d1.ppoint = &p;d1.array[0] = 0;d1.array[1] = 0;d2 = d1;

d1.point.x = 1;d1.point.y = 1;p.x = 1;p.y = 1;d1.array[0] = 1;d1.array[1] = 1;

printf("%d\t %d\n", d2.point.x, d2.point.y);printf("%d\t %d\n", d2.ppoint->x,d2.ppoint->y); printf("%d\t %d\n", d2.array[0],d2.array[1]); }

Page 13: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR5 – Nivel 1Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº3: Aunque la variable de un array sea

equivalente a un puntero, aquí su memoria está reservada dentro del struct, por lo que se copian los contenidos físicamente.

• Moraleja: – La copia de un struct hace un “shallow copy”, exactamente

igual al operador de copia por defecto de las clases.– La copia equivale a un “memcopy”, exceptuando el “alignment”

de los miembros del struct

3!

Page 14: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR6 – Nivel 1class A {

private: static int m_refCount;

int m_objNumber;

public: A() { m_objNumber = ++m_refCount; }

~A() { printf("n %d\n", m_objNumber); }

};

int A::m_refCount = 0;

¿Cuál será la salida del programa?1) n 1, n 2, n 3, n 42) n 1, n 23) n 1, n 2, n 1, n 2 y se queda

memoria alocada4) n 1, n 2 y se queda memoria

alocada

void main() {

std::list<A> listaObjetos;

std::list<A*> listaPunteros;

listaObjetos.push_back(A());

listaObjetos.push_back(A());

listaPunteros.push_back(new A());

listaPunteros.push_back(new A());

}

Page 15: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR6 – Nivel 1Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº3: Los objetos a los que apuntan los

punteros en una lista no se desalocan automáticamente. • Moraleja: Las listas de objetos son seguras pero tienen el

precio de la copia, mientras que las listas de punteros son más eficientes pero no son seguras.

3!

Page 16: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR7 – Nivel 2///// func.h

extern "C" void setNumber(int n);

///// func.c (Compilado en C)

extern int number = 5;

void setNumber(int n) {number = n;}

//// main.cpp (Compilado en C++)

#include "func.h"

extern int number = 1;

void main() {

printf("%d\n", number);

setNumber(6);

printf("%d\n", number);

number = 2;

printf("%d\n", number);

}

¿Cuál será la salida del programa?1) 1, 1, 22) 5, 6, 23) 5, 6, 64) 1, 6, 25) Error del linker6) ‘INDEFINIDO’ (1 ó 5), 6, 2

Page 17: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR7 – Nivel 2Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº1: C y C++ son lenguajes diferentes, no

comparten la nomenclatura de los símbolos. • Moraleja: Si se van a compartir variables globales, utilizar

“extern “C”” para que C++ sepa que la variable va a tener un símbolo de C.

1!

Page 18: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR8 – Nivel 2///// globalvec.h#include <vector>extern std::vector<int> globalVector;//// globalvec.cpp#include "globalvec.h“std::vector<int> globalVector;

///// main.cpp

#include "globalvec.h“

class Clase {

public: Clase() {

globalVector.push_back(0);

printf("Constructor Clase\n");}

};

Clase globalObj;

int main() {

printf("Hello World!\n");

return 0;

}

¿Cuál será la salida del programa?1) Hello Word!2) Contructor Clase Hello World!3) Cascará4) 50%-50% entre 2 y 3.

Depende de tu compilador y de tu suerte.

Page 19: Trampas en c ++

Desayunos Técnicos

Trampas en C++

TR8 – Nivel 2Bjarne Stroustrup nos ilustra con aclaraciones correctas

y fallos típicos• Opción correcta Nº4: El compilador no tiene forma de saber

cual de los objetos estáticos debe crear antes, Static Initialization Order Fiasco.

• Moraleja: No hacer objetos estáticos dependientes entre si.

4!