Запрет на delete во время компилляции...
От: Keeper_andrew Беларусь  
Дата: 22.02.03 12:42
Оценка:
Имеется класс, наследованный от структуры (закос под ком). Класс хитро спрятан внутри dll и наружу можно получить только указатель на интерфейс через функцию dll.

Вот реализация класса:


struct ITDAlgoritmLibrary
{
    virtual HRESULT __stdcall LoadSettings() = 0;
};


class CTDAlgoritmLibrary : public ITDAlgoritmLibrary
{
    virtual HRESULT __stdcall LoadSettings() {return S_OK;};
public:
    CTDAlgoritmLibrary();
    ~CTDAlgoritmLibrary();
};


Как запретить компилляцию кода содержащего вызов оператора delete для интерфейса. Например:


    ITDAlgoritmLibrary *obj = NULL; // интерфейс получим в эту переменную
    TDAlgoritmLibraryInstance(&obj); // этой функцией из dll получаем объект
    delete obj; // а вот такую штуку хотелось бы запретить даже на этапе компилляции (или линковки)


Естественно, что компилляция и вызов следующего кода не должен вызывать ошибок. То есть для CTDAlgoritmLibrary* можно вызвать delete, а для ITDAlgoritmLibrary* нельзя.

    CTDAlgoritmLibrary *obj = new CTDAlgoritmLibrary();
    delete obj;


Заранее спасибо.
... << RSDN@Home 1.0 beta 6a >>
Re: Запрет на delete во время компилляции...
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 22.02.03 13:30
Оценка:
Здравствуйте КА.

А вариант с абстрактным делете не пройдет?


virtual void operator delete() = 0;
Re: Запрет на delete во время компилляции...
От: Anton V. Kolotaev  
Дата: 22.02.03 14:17
Оценка:
Здравствуйте, Keeper_andrew, Вы писали:

KA>Как запретить компилляцию кода содержащего вызов оператора delete для интерфейса.



struct ITDAlgoritmLibrary
{
    virtual HRESULT __stdcall LoadSettings() = 0;
protected: 
   ~ITDAlgorithmLibrary() {}
};
Re[2]: Запрет на delete во время компилляции...
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 22.02.03 14:20
Оценка:
Здравствуйте, BitField, Вы писали:

BF>А вариант с абстрактным делете не пройдет?

Ты не забыл, что operator delete() является статическим членом класса?
Алексей Кирдин
Re: Запрет на delete во время компилляции...
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 22.02.03 14:32
Оценка:
Здравствуйте, Keeper_andrew, Вы писали:

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

Ты ведь помнишь, что если у клиента и у сервера разный memory management, то мешать выделение и уничтожение памяти нельзя. Посему, что создается в клиенте, должно быть им же самим и уничтожено. То же верно и для сервера.

Намного сложнее требовать от клиена компилировать свой код "только в конфигурации "Multithreaded DLL"", когда оно ему "...даром не нать, и с деньгами не нать!"

Собственно, в COM для избежания проблем с наличием разных, или полным отсутствием CRT вообще, для того, чтобы безопасно выделять память, а потом освобождать в другом месте (читай, бинарнике), придуман механизм, реализуемый набором CoTaskMemXXX.

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

Еще одно: В твоем псевдо-коде ты забыл, что класс, производный от интерфейса, должен быть снабжен виртуальным деструктором.
Алексей Кирдин
Re[2]: Запрет на delete во время компилляции...
От: Keeper_andrew Беларусь  
Дата: 23.02.03 01:01
Оценка:
Здравствуйте, BitField, Вы писали:

BF>Здравствуйте КА.


BF>А вариант с абстрактным делете не пройдет?


BF>

BF>
BF>virtual void operator delete() = 0;
BF>


error C2650: 'ITDAlgoritmLibrary::operator delete' : cannot be a virtual function
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Запрет на delete во время компилляции...
От: Keeper_andrew Беларусь  
Дата: 23.02.03 01:01
Оценка: -1
Здравствуйте, Anton V. Kolotaev, Вы писали:

AVK>Здравствуйте, Keeper_andrew, Вы писали:


KA>>Как запретить компилляцию кода содержащего вызов оператора delete для интерфейса.


AVK>

AVK>struct ITDAlgoritmLibrary
AVK>{
AVK>    virtual HRESULT __stdcall LoadSettings() = 0;
AVK>protected: 
AVK>   ~ITDAlgorithmLibrary() {}
AVK>};
AVK>


error C2523: 'ITDAlgoritmLibrary::~ITDAlgorithmLibrary' : destructor tag mismatch
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Запрет на delete во время компилляции...
От: Keeper_andrew Беларусь  
Дата: 23.02.03 01:01
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>Еще одно: В твоем псевдо-коде ты забыл, что класс, производный от интерфейса, должен быть снабжен виртуальным деструктором.


Спасибо за дельный совет — наверное старею.
... << RSDN@Home 1.0 beta 6a >>
Re: Запрет на delete во время компилляции...
От: Keeper_andrew Беларусь  
Дата: 23.02.03 01:01
Оценка:
Если считаете что шкурка выделки не стоит, то давайте закроем эту ветку.
... << RSDN@Home 1.0 beta 6a >>
Re: Запрет на delete во время компилляции...
От: ilnar Россия  
Дата: 25.02.03 10:37
Оценка: -1
Здравствуйте, Keeper_andrew, Вы писали:



struct ITDAlgoritmLibrary
{
    virtual HRESULT __stdcall LoadSettings() = 0;
private:
// реализовывать не надо
void operator delete(ITAlgoritmLibrary *p, size_t n);
};

class CTDAlgoritmLibrary : public ITDAlgoritmLibrary
{
    virtual HRESULT __stdcall LoadSettings() {return S_OK;};
public:
    CTDAlgoritmLibrary();
    ~CTDAlgoritmLibrary();
void operator delete(CTDAlgoritmLibrary *p, size_t n)
{
::delete p;
}
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.