Bonjoru tout le monde.

Dans un programme plus vaste, j'ai un problème avec un constructeur/desctructeur. Le crash vient au moment de libérer la mémoire quand tous les destructeurs sont appelés en chaine.

(je ne mets pas tous les include pour na pas polluer, include "string.h", include des classes.h)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
//Programme principale
void main()
{
    CTestB loc_test_b = CTestB();
    {
        CTest loc_test2 = CTest(loc_test_b);
 
        //delete loc_test2; test effectué en faisant un new a la ligne précédente
    }
};
Classe principale encapsulant un sous classe B
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
class CTest
{
public:
    CTest();
    CTest(CTestB&);
    ~CTest();
private:
    CTestB m_test_B;
};
 
//Code
CTest::CTest()
{
    m_test_B = CTestB();
}
 
CTest::CTest(CTestB& par_test_b)
{
    m_test_B = CTestB(par_test_b);
}
 
CTest::~CTest()
{
    //delete m_test_B;
}
Contenu de la classe b :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
class CTestB
{
public:
    CTestB();
    ~CTestB();
 
    CTestB(const CTestB& par_cls_testB);
    char* mGetAddr() const {return addr;};
private:
    char *addr;
 
};
 
//CODE
CTestB::CTestB()
{
    addr = new char[20];
    strncpy(addr, "init", 5);
}
 
CTestB::CTestB(const CTestB& par_cls_testB)
{
    addr = new char[20];
    strncpy(addr, par_cls_testB.mGetAddr(), 5);
    strncat(addr, "copy", 5);
}
 
CTestB::~CTestB()
{
    if(addr != NULL)
    {
        delete addr;
        addr = NULL;
    }
}
Le problème survient au delete addr. Ce pointeur a déjà été libéré ... Grrr, l'erreur doit être basique mais je m'y perd.

Quelqu'un voit il mieux que moi ?