Почему я ненавижу Functor?
От: IROV..  
Дата: 01.05.08 20:14
Оценка:
Все очень просто, я на днях убил пол рабочего дня на поиски бага, о котором читал только в умных книгах.

И бог знает сколько бы еще искал, если бы не случайность.

попробую привести минимально воспроизводимый код.

main.cpp
#    include "Ptr.hpp"
#    include "Node.hpp"

#    include <string>

class GetItemResponse
{
public:
    virtual ~GetItemResponse(){}

protected:
    std::string a;
};

void main()
{
    node();
    Ptr<GetItemResponse> ir = new GetItemResponse;
}


Node.hpp
#    pragma once

void node();


Node.cpp
#    include "Node.hpp"
#    include "Ptr.hpp"

class GetItemResponse
{
public:
    virtual ~GetItemResponse(){}

protected:
    float a;
};

void node()
{
    Ptr<GetItemResponse> pt = new GetItemResponse;
}


Ptr.hpp
#    pragma once

template<class T>
class Ptr
{
public:
    Ptr( T * _t ): ptr(_t){}
    ~Ptr(){ delete ptr;    }

protected:
    T * ptr;
};


Если кто думает что это очень редкий случай, то я тоже так думал, пока не начал работать в компани в которой больше одного программиста на проект (а это везде) и пишут они асинхронные приложения.



желаю удачи! и не повторять таких вот ошибок которые так портят настроения
я не волшебник, я только учусь!
Re: Почему я ненавижу Functor?
От: vlad.k  
Дата: 01.05.08 20:24
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Все очень просто, я на днях убил пол рабочего дня на поиски бага, о котором читал только в умных книгах.


IRO>И бог знает сколько бы еще искал, если бы не случайность.


IRO>попробую привести минимально воспроизводимый код.


Тема бага нераскрыта, тема бреда превалирует
Re[2]: Почему я ненавижу Functor?
От: IROV..  
Дата: 01.05.08 20:28
Оценка:
Здравствуйте, vlad.k, Вы писали:

VK>Тема бага нераскрыта, тема бреда превалирует

я знал что людям нужно шоу и люди не любят много букв

в кратце

компилятор деляет одну виртуальную таблицу, и обьект я создаю по одному подобию а удаляется по другому.
я не волшебник, я только учусь!
Re[3]: Почему я ненавижу Functor?
От: gear nuke  
Дата: 01.05.08 20:46
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>компилятор деляет одну виртуальную таблицу, и обьект я создаю по одному подобию а удаляется по другому.


Линкер, наверно, а не функтор?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Почему я ненавижу Functor?
От: IROV..  
Дата: 01.05.08 20:51
Оценка: :))) :)))
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, IROV.., Вы писали:


IRO>>компилятор деляет одну виртуальную таблицу, и обьект я создаю по одному подобию а удаляется по другому.


GN>Линкер, наверно, а не функтор?


Линкер, функтор, какая разница

главное люди пострадали
я не волшебник, я только учусь!
Re: Почему я ненавижу Functor?
От: Roman Odaisky Украина  
Дата: 01.05.08 21:24
Оценка: 1 (1)
Здравствуйте, IROV.., Вы писали:

IRO>Все очень просто, я на днях убил пол рабочего дня на поиски бага, о котором читал только в умных книгах.


Нарушение ODR? Или всё же баг?

IRO>попробую привести минимально воспроизводимый код.


Наверное, вот так проще и понятней:

main.cpp
#include "trouble.h"

int main()
{
    trouble1();
    trouble2();
}

trouble.h
void trouble1();
void trouble2();

trouble1.cpp
#include "trouble.h"
#include <iostream>

namespace NS
{
    struct Trouble
    {
        virtual ~Trouble()
        {
            std::cout << 1 << std::endl;
        }
    };
}

void trouble1()
{
    delete new NS::Trouble;
}

trouble2.cpp
#include "trouble.h"
#include <iostream>

namespace NS
{
    struct Trouble
    {
        virtual ~Trouble()
        {
            std::cout << 2 << std::endl;
        }
    };
}

void trouble2()
{
    delete new NS::Trouble;
}

% g++ -o a.out *.cpp && ./a.out
1
1
% g++ -D'NS'='' -o a.out *.cpp && ./a.out
1
2

Вроде народ и так знает, что запрещено объявлять в разных единицах трансляции функции с одинаковыми именами... а вот теперь выясняется, что и дубликаты классов вредны для здоровья. Или всё-таки баг?
До последнего не верил в пирамиду Лебедева.
Re: Почему я ненавижу Functor?
От: Анатолий Широков СССР  
Дата: 01.05.08 22:18
Оценка: 2 (2) +2
Здравствуйте, IROV.., Вы писали:

IRO>Все очень просто, я на днях убил пол рабочего дня на поиски бага, о котором читал только в умных книгах.



Тема давно раскрыта. Впредь, если вводишь сущность не входящую в публичный интерфейс, объявляй ее в анонимном пространстве имен. В противном случае, ты сам себе злобный Буратино.
Re: Почему я ненавижу Functor?
От: Sergey Россия  
Дата: 02.05.08 06:33
Оценка: +2
> Ptr.hpp
>
> # pragma once
>
> template<class T>
> class Ptr
> {
> public:
> Ptr( T * _t ): ptr(_t){}
> ~Ptr(){ delete ptr; }
>
> protected:
> T * ptr;
> };
>


Немного оффтоп, но за такой Ptr — руки поотрывать.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Почему я ненавижу Functor?
От: Аноним  
Дата: 02.05.08 08:40
Оценка: :)
Здравствуйте, Sergey, Вы писали:

>> Ptr.hpp

>>
>> # pragma once
>>
>> template<class T>
>> class Ptr
>> {
>> public:
>> Ptr( T * _t ): ptr(_t){}
>> ~Ptr(){ delete ptr; }
>>
>> protected:
>> T * ptr;
>> };
>>


S>Немного оффтоп, но за такой Ptr — руки поотрывать.


Это, видимо, не Ptr, а AutoDeleteAnyway. Просто назван неправильно.
Re[3]: Почему я ненавижу Functor?
От: IROV..  
Дата: 02.05.08 11:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это, видимо, не Ptr, а AutoDeleteAnyway. Просто назван неправильно.


Может это просто треш?
я не волшебник, я только учусь!
Re[2]: Почему я ненавижу Functor?
От: IROV..  
Дата: 02.05.08 11:30
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Вроде народ и так знает, что запрещено объявлять в разных единицах трансляции функции с одинаковыми именами... а вот теперь выясняется, что и дубликаты классов вредны для здоровья. Или всё-таки баг?


Проблема в том как себя убереч от этого? Единственое что я щас придумал так это анонимное пространство имен.

а по поводу того что дубликаты классов, надо попробовать убрать виртуальный деструктор. может подводит табличка?
я не волшебник, я только учусь!
Re[2]: Почему я ненавижу Functor?
От: Centaur Россия  
Дата: 03.05.08 02:44
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Вроде народ и так знает, что запрещено объявлять в разных единицах трансляции функции с одинаковыми именами... а вот теперь выясняется, что и дубликаты классов вредны для здоровья. Или всё-таки баг?


Дык, опаньки. 3.2 One Definition Rule действует на всё, что может торчать наружу из единицы трансляции:

5. There can be more than one definition of a class type (clause 9), enumeration type (7.2), inline function with external linkage (7.1.2), class template (clause 14), non-static function template (14.5.5), static data member of a class template (14.5.1.3), member function of a class template (14.5.1.1), or template specialization for which some template parameters are not specified (14.7, 14.5.4) in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.