Имеется класс, наследованный от структуры (закос под ком). Класс хитро спрятан внутри dll и наружу можно получить только указатель на интерфейс через функцию dll.
Как запретить компилляцию кода содержащего вызов оператора delete для интерфейса. Например:
ITDAlgoritmLibrary *obj = NULL; // интерфейс получим в эту переменную
TDAlgoritmLibraryInstance(&obj); // этой функцией из dll получаем объектdelete obj; // а вот такую штуку хотелось бы запретить даже на этапе компилляции (или линковки)
Естественно, что компилляция и вызов следующего кода не должен вызывать ошибок. То есть для CTDAlgoritmLibrary* можно вызвать delete, а для ITDAlgoritmLibrary* нельзя.
CTDAlgoritmLibrary *obj = new CTDAlgoritmLibrary();
delete obj;
Здравствуйте, BitField, Вы писали:
BF>А вариант с абстрактным делете не пройдет?
Ты не забыл, что operator delete() является статическим членом класса?
Если это действительно закос под COM, то тебя не должно волновать, что делают клиенты с твоим указателем на интерфейс, т.к. ты им дашь подсчет ссылок.
Ты ведь помнишь, что если у клиента и у сервера разный memory management, то мешать выделение и уничтожение памяти нельзя. Посему, что создается в клиенте, должно быть им же самим и уничтожено. То же верно и для сервера.
Намного сложнее требовать от клиена компилировать свой код "только в конфигурации "Multithreaded DLL"", когда оно ему "...даром не нать, и с деньгами не нать!"
Собственно, в COM для избежания проблем с наличием разных, или полным отсутствием CRT вообще, для того, чтобы безопасно выделять память, а потом освобождать в другом месте (читай, бинарнике), придуман механизм, реализуемый набором CoTaskMemXXX.
Рядом предложенный вариант с закрытием деструктора ничего не даст. Более того, у интерфейса (раз уж это закос под COM) не должно быть никаких данных, никаких закрытых методов, и все методы должны быть виртуальными.
Еще одно: В твоем псевдо-коде ты забыл, что класс, производный от интерфейса, должен быть снабжен виртуальным деструктором.
Здравствуйте, Anton V. Kolotaev, Вы писали:
AVK>Здравствуйте, Keeper_andrew, Вы писали:
KA>>Как запретить компилляцию кода содержащего вызов оператора delete для интерфейса.
AVK>
Здравствуйте, Kaa, Вы писали:
Kaa>Еще одно: В твоем псевдо-коде ты забыл, что класс, производный от интерфейса, должен быть снабжен виртуальным деструктором.