
Сообщение от
Avazart
Builder справляется с предложеным кодом
С теми двумя тестовыми классами в сферическом вакууме все в полном порядке))
Проблемы начинаются в многофайловом проекте. А если там ещё и иерархия очень развитая - там вообще без 100 грамм потом не разберёшься.
Попробуй протестировать вот такую вещь:
Предположим, что данный класс - один из многих в большой-большой системе:
//CAgent.h
C++ (Qt) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #ifndef CAgent_h
#define CAgent_h
//интеллектуальный шаристый указатель.
#include "ConstCode/Template/TSharedPointer.h"
class Test;
typedef TSharedPointer< Test > pTest_t;
class Agent
{
public:
Agent();
~Agent();
pTest_t GetTest()const;
private:
pTest_t mpTest; //наш подопытный кролик
};
#endif |
|
//CAgent.cpp
C++ (Qt) |
1
2
3
4
5
| #include "Test.h"
Agent::Agent(){ mpTest = new Test();}
Agent::~Agent(){}
pTest_t Agent::GetTest()const{ return mpTest; } |
|
//Test.h
C++ (Qt) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #ifndef Test_h
#define Test_h
#include <iostream>
struct test2
{
~test2() { std::cout <<"dtor\n"; }
};
class Test
{
public:
void Work();
test2 tmp;
};
#endif |
|
//main.cpp
C++ (Qt) |
1
2
3
4
5
6
7
| int main()
{
Agent agent;
pTest_t gm;
gm = agent.GetTest();
} |
|
Собственно, попадаем во внутрь интеллектуального указателя:
C++ (Qt) |
1
2
3
4
5
6
7
8
9
10
11
| void_TSharedPointer::Release()
{
if(mp_CounterLink==0) { return; }
--(*mp_CounterLink);
if( (*mp_CounterLink)==0 )
{
//: warning C4150: удаление указателя на неполный тип 'Test'; деструктор не вызван
delete mp_CounterLink; delete mp_Pointer;
}
Clear();
} |
|
Справедливости ради, стоит заметить, что в бустовских умных указателях учли этот нюанс. Там стоит защита. Если нечто подобное будет иметь место быть - будет ошибка времени компиляции, но я сам не проверял.